为什么.forEach()异步操作? - node.js

时间:2017-07-09 22:54:49

标签: javascript arrays node.js foreach cheerio

我正在尝试使用request从网页获取一些信息以获取页面,然后cheerio将DOM遍历到我需要的特定部分我正在重复此过程使用此代码使用array.forEach的数组中的元素:

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

但是我得到了这个内容:

done
1.31 AUD
1.28 CAD

你能告诉我为什么array.forEach没有阻止我的代码?

1 个答案:

答案 0 :(得分:2)

您在向谷歌返回的任何http请求之前打印“已完成”。

你循环使用这些货币,为每个货币调用谷歌,然后打印'完成'。然后调用开始返回(按随机顺序,顺便说一句),然后打印结果。

因此,forEach不是异步的,但http请求是。