2017-07-03 2 views
0

J'ai un tableau d'éléments:boucle par tableau et effectuer Ma requête SQL basée sur le résultat de la requête précédente pour chaque entrée dans le tableau

var myArr = ['item1', 'item2', 'item3']; 

Je tente de boucler sur ces articles et vérifier si elles existe dans ma base de données. Si l'élément n'existe pas, je l'ajoute à la base de données.

var sql = 'Select * from DB where item="' + myArr[i] + '"'; 
connection.query(sql, function(e, r, f) { 
    if(!e && r.length <= 0) { 
     performInsertOnDB(myArr[i]); 
    } 
}); 

Mon problème est, la référence à la variable i ne resterai pas comme connnection.query est asynchrone. J'ai besoin d'attendre que le premier choix se termine avant que je puisse continuer. J'essaye d'utiliser la bibliothèque Async pour accomplir ceci, mais je ne dois pas comprendre complètement comment accomplir la tâche.

C'est ce que j'ai jusqu'à présent:

async.each(lootArray, function(lootItem, addLootItem) { 
    var sql = "SELECT * FROM loot_history WHERE date = DATE('" + moment(lootItem[1]).format('YYYY-MM-DD') + "') AND time = '" + lootItem[2] + "' AND itemId = " + lootItem[4]; 
    connection.query(sql, function(error, results, fields) { 
     if (error) { 
      sendDiscordMessage(loachannel, error + ', <@105094681141977088>'); 
      return false; 
     } else { 
      if (results.length > 0) { 
       //duplicates.push(lootArray[i]); 
      } else { 
       addLootItem(lootItem); 
      } 
     } 
    }); 
}, function(err) { 
    // if any of the file processing produced an error, err would equal that error 
    if (err) { 
     // One of the iterations produced an error. 
     // All processing will now stop. 
     console.log('A file failed to process'); 
    } else { 
     console.log('All files have been processed successfully'); 
    } 
}); 

function addLootItem(lootItem) { 
    var sql = "INSERT INTO loot_history SET player = " + lootItem[0] + ", date = " + moment(lootItem[1]).format('YYYY-MM-DD') + ", time = '" + lootItem[2] + ", item = " + lootItem[3] + ", itemId = " + lootItem[4] + ", itemString=" + lootItem[5] + ", response= " + lootItem[6] + ", votes= " + lootItem[7] + ", class= " + lootItem[8] + ", instance=" + lootItem[9] + ", boss=" + lootItem[10] + ", gear1=" + lootItem[11] + ", gear2=" + lootItem[12] + ", reasponseId=" + lootItem[13] + ", isAwardReason=" + lootItem[14]; 
    connection.query(sql, function(error, results, fields) { 
     if (error) { 
      sendDiscordMessage(loachannel, error + ', <@105094681141977088>'); 
     } 
    }); 
} 

EDIT: Tout fonctionne, sauf le AddLootItem de rappel ne se déclenche pas. Pourquoi ce rappel n'est-il pas appelé? Je peux définir des événements de journal dans cette instruction if qui s'exécute, mais la fonction elle-même ne se déclenche jamais.

Répondre

2

Le problème est que le nom du rappel asynchrone est identique à la fonction que vous voulez appeler lorsque l'élément n'existe pas. Essayez de changer le nom de la fonction en quelque chose d'autre: callback, et appelez-le dans votre instruction if ou passez-le à addLootItem, et appelez-le une fois l'élément ajouté.

async.each(lootArray, function(lootItem, callback) { 
    var sql = "SELECT * FROM loot_history WHERE date = DATE('" + moment(lootItem[1]).format('YYYY-MM-DD') + "') AND time = '" + lootItem[2] + "' AND itemId = " + lootItem[4]; 
    connection.query(sql, function(error, results, fields) { 
     if (error) { 
      sendDiscordMessage(loachannel, error + ', <@105094681141977088>'); 
      calback(err); 
     } else { 
      if (results.length > 0) { 
       //duplicates.push(lootArray[i]); 
       callback(); 
      } else { 
       addLootItem(lootItem, callback); 
      } 
     } 
    }); 
}, function(err) { 
    // if any of the file processing produced an error, err would equal that error 
    if (err) { 
     // One of the iterations produced an error. 
     // All processing will now stop. 
     console.log('A file failed to process'); 
    } else { 
     console.log('All files have been processed successfully'); 
    } 
}); 

function addLootItem(lootItem, done) { 
    var sql = "INSERT INTO loot_history SET player = " + lootItem[0] + ", date = " + moment(lootItem[1]).format('YYYY-MM-DD') + ", time = '" + lootItem[2] + ", item = " + lootItem[3] + ", itemId = " + lootItem[4] + ", itemString=" + lootItem[5] + ", response= " + lootItem[6] + ", votes= " + lootItem[7] + ", class= " + lootItem[8] + ", instance=" + lootItem[9] + ", boss=" + lootItem[10] + ", gear1=" + lootItem[11] + ", gear2=" + lootItem[12] + ", reasponseId=" + lootItem[13] + ", isAwardReason=" + lootItem[14]; 
    connection.query(sql, function(error, results, fields) { 
     if (error) { 
      sendDiscordMessage(loachannel, error + ', <@105094681141977088>'); 
     } 
     done(); 
    }); 
} 
+0

Vous êtes mon héros. Merci de m'avoir aidé à comprendre. – Smak

+1

vous êtes les bienvenus :) –