2017-07-03 10 views
0

私は、項目の配列がありますループ、配列を、配列の各エントリの前のクエリの結果に基づいて、私のSQLクエリを実行

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

私はこれらの項目をループにしようとしていますが、彼らがいるかどうかをチェック私のデータベースに存在します。アイテムが存在しない場合は、データベースに追加します。

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

私の問題は、変数iへの参照がconnnection.queryが非同期であるために残らないことです。私は続ける前に最初の選択が終わるまで待つ必要があります。私は、これを達成するために非同期ライブラリを使用しようとしているが、私は完全にタスクを実行する方法を掴んではいけません。

これは私がこれまで持っているものです。

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:すべてはAddLootItemが発射されていないコールバックを除き、動作します。このコールバックが呼び出されないのはなぜですか?実行するif文でログイベントを設定できますが、関数自体は決して起動しません。

答えて

2

非同期コールバックの名前は、アイテムが存在しないときに呼び出す関数と同じです。関数内の名前を何か他のものに変更しようとしましょう:コールバックを呼び出してif文で呼び出すか、addLootItemに渡して、項目を追加した後に呼び出します。

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

あなたは私のヒーローです。ご理解いただきありがとうございます。 – Smak

+1

あなたは歓迎です:) –

関連する問題