почему .forEach() действует асинхронно? - node.js

Я пытаюсь получить некоторую информацию с веб-страницы, используя 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 не блокирует мой код?


person Ahmad Aljabali    schedule 09.07.2017    source источник
comment
Он блокирует код, но асинхронный запрос не блокирует... он forEachs обрабатывает массив и для каждого элемента отправляет асинхронный запрос. Последний журнал выполняется до завершения запросов.   -  person Andrew Li    schedule 10.07.2017
comment
@AndrewLi сделайте это ответом для дальнейшего использования   -  person taha    schedule 10.07.2017
comment
Этот общий тип вопроса (непонимание того, как работают асинхронные вызовы в nodejs) задается здесь несколько раз в день. Здесь есть сотни связанных вопросов/ответов.   -  person jfriend00    schedule 10.07.2017
comment
рассматривая stackoverflow.com/q/5050265/497418 и stackoverflow.com/q/14220321/497418 как дубликаты. ни совсем не подходит   -  person zzzzBov    schedule 10.07.2017
comment
Здесь показано, как вы сообщаете, когда выполняются несколько асинхронных вызовов (что здесь и происходит на самом деле): Отслеживание выполнения нескольких асинхронных вызовов   -  person jfriend00    schedule 10.07.2017


Ответы (1)


Вы печатаете «готово» до того, как любой из ваших http-запросов к Google вернется.

Вы перебираете валюты, звоните в Google для каждой из них и печатаете «готово». Затем вызовы начинают возвращаться (в случайном порядке, кстати), и вы печатаете результаты.

Таким образом, forEach не является асинхронным, но HTTP-запросы.

person Software Engineer    schedule 09.07.2017