これはnode.jsのlearnyounodeチュートリアル練習9からのものです。なぜ私のコードがデータを順番に印刷しないのか分かりません。learnyounode - ジャグリング非同期 - 異なる注文
let http = require('http'),
bl = require('bl'),
urlArray = [process.argv[2], process.argv[3], process.argv[4]]
results = []
//counter = 0;
function collectData(i) {
http.get(urlArray[i], (res) => {
res.pipe(bl((err, data) => {
if (err) {
return console.log(err);
}
data = data.toString();
results[i] = data;
//counter++;
//if (counter === 3) {
if (results.length === 3) {
results.forEach((result) => {
console.log(result);
})
}
}))
})
}
for (let i = 0; i < urlArray.length; i++) {
collectData(i);
}
forループは、最初のurlから開始し、最後まで順番に進む必要があります。私の理解から、ループの現在の反復で何が起こっても、ループが次の反復に移動するように解決する必要があります。しかし、結果はランダムであるように見えます。コマンドラインで私のソリューションを実行すると、時々結果が整然としたものになることがあります。
編集:これは現在動作している私の解決策です。私はカウンタ変数を追加し、http要求を関数に入れました。
*「ループの現在の繰り返しで起こるものは何でも次の反復に移動するループのために解決しなければならない」* - いいえ、それは特に何非同期ですコードはありません。これは非同期の*定義*です。 – JJJ
@JJJこれは、node.jsのすべてのforループが必ずしも順番に実行されないということですか? – James
いいえ、非同期メソッドが必ずしも順番に解決されるわけではありません。 HTTPリクエストは順番に送信され、コールバックは応答を得るたびに呼び出されます。 – JJJ