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.
Vous êtes mon héros. Merci de m'avoir aidé à comprendre. – Smak
vous êtes les bienvenus :) –