私はNodeJSプログラムに少し問題があります。NodeJS forループを非同期にする
私のforループの機能は、SQLデータベースのインデックスを繰り返し処理し、forループを実行するたびにGET要求を行う別の関数を呼び出すことになっています。
それは私のすべての指標を反復しているので、すべてのGETリクエストをすべて一度に/非常に高速にします。これにより、私はもうAPIコールを作成できなくなります。私はsetTimeoutを使ってみましたが、それは次のインデックスに反復して値が確定しないので動作しません。
また、コールバックを試みましたが、何も変更されませんでした。私は非同期を調べてみましたが、私がやっていることに本当に頭を浮かべることはできません。またノートだけで、何も実際に返されていません。私の他の機能では、私はSQL DBを更新しています。私は、実行ごとにAPIコールを作成するためにforループが必要になり、完了後にのみ続行します。
function callGet() {
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "USERNAME",
password: "PASSWORD",
database: "sys"
});
con.query("SELECT nameAlone FROM testDB", function(err, result, fields) {
var i;
for(i = 0; i < result.length; i++){
var name = result[i].nameAlone;
var options = {
method: 'GET',
url: 'site.com',
qs: {
key: 'MYKEY',
page_size: 10,
intent: 0,
itemName: name
},
headers: {
'postman-token': postman-token,
'cache-control': 'no-cache'
}
};
getListing(options,result, i); //Only being called after the for loop iterates through all of result.length
}
});
}
何が起こっているかの例がこれです、のは、0-2からのループが繰り返さために言わせて、各ランの名前をプリントアウト関数を呼び出します。 代わりの
index:0, name:Chris, index:1, name:Tony, index:2, name:John
これは、プリントアウトします:任意の助けを事前に
index:0, index:1, index:2, name:Chris, name:Tony, name:John
感謝を。
編集:私はすでに提案された重複した質問で自分の問題に適用されたすべての回答を試みました。そこの答えの一つで回り込みを試みているが、それがうまくいくかどうかは分からない。
Edit2:そこのすべてのソリューションが機能しませんでした。
EDIT3(溶液):誰もが非常にシンプルなソリューションを望んでいる場合、私はセットアップに非常に簡単だったこのパッケージが見つかりました:私がしなければならなかったすべては私の指標とセットアップasyncLoopを持つ配列を作成https://github.com/nathan818fr/async-loop
ました
asyncLoop(indices, function (item, next)
{
var name = result[item].nameAlone;
var options = {
method: 'GET',
url: 'site.com',
qs: {
key: 'MYKEY',
page_size: 10,
intent: 0,
itemName: name
},
headers: {
'postman-token': postman-token,
'cache-control': 'no-cache'
}
};
getListing(options,result, item);
next();
}, function()
{
console.log('Finished!');
});
[Javascriptの非同期ループ処理]の可能な重複(https://stackoverflow.com/questions/9772400/javascript-async-loop-processing) – Paul
はすでに実際とsetTimeoutsを使用しようとしました:ここではデモがあります遅延とsetTimeout 0のトリック。 – Tony
@Paul提案されている質問は、長時間実行しているタスクをスレッドから排除し、他のタスクを飢えさせるのを止める方法です。この質問は、ループの各反復で非同期操作が完了するのを待つことにあるようです。 – apsillers