2017-07-09 3 views
-2

私は、ページを取得するためにrequestを使用してWebページから情報を取得しようとしています。次に、cheerio DOMを特定の部分に移動する必要があります。.forEach()が非同期で動作するのはなぜですか? - node.js

const cheerio = require('cheerio'); 
const request = require('request'); 
var i = 0; 
var rates = []; 
['AUD', 'CAD'].forEach(function(currancy){ 
    var url = "https://www.google.com/finance/converter?a=1&from=USD&to=" + currancy 
    request(url , function(error, res , body){ 
    const $ = cheerio.load(body); 
    var temp = $('.bld'); 
    var rate = temp.text(); 
    console.log(rate); 
    rates[i]= rate; 
    i++; 
    }) 
}); 
console.log('done'); 

私は期待していた結果がこのようなものです::

1.31 AUD 
1.28 CAD 
done 

が、私は、これはinsted取得しています:array.forEachこのコードを使用して

done 
1.31 AUD 
1.28 CAD 

array.forEachが私のコードをブロックしない理由を教えてください。

+2

*はコードをブロックしていますが、非同期要求*は非ブロックです* ... forEachは配列全体と各要素に対して非同期の要求を送信します。最後のログは、要求が完了する前に実行されます。 – Li357

+0

@AndrewLiは、将来の参照のための答えにします – taha

+3

この一般的なタイプの質問(ノードjでの非同期呼び出しの動作に関する誤解)は、ここで複数回質問されます。ここには何百もの関連する質問/回答があります。 – jfriend00

答えて

2

あなたのhttpリクエストの前に「完了」と表示されます。

通貨をループして、それぞれの電話をかけ、「完了」を印刷します。その後、呼び出しが返り始めます(ランダムな順序でbtw)、結果を出力します。

したがって、forEachは非同期ではありませんが、http要求はです。

関連する問題