nodejs l oop функция вызывает проблему вывода - PullRequest
0 голосов
/ 09 мая 2020

У меня вопрос, я не понимаю, как работает этот код.

ans.map((val, indx) => {
   const options = {
        host: 'www.xxxx.com',
        path: '/path'
        port: 80,
        path: path,
        method: 'GET',
    };

    console.log(val)

    send.getJSON(options, (code ,result) => {
        console.log("oke22");
    });
})

Для [1,2,3] я получаю следующие выходные данные:

1
2
3
oke
oke
oke

Почему результат а не следующее?

1
oke
2
oke
3

1 Ответ

1 голос
/ 09 мая 2020

Проблема в том, что ваш .getJSON асинхронен, работает в синхронном коде, это неплохо, но обрабатывается немного иначе.

В дизайне Node.js используется event-l oop для обеспечения асинхронности на однопоточном языке, таком как JavaScript.

Таким образом, ваш обратный вызов фактически не будет вызываться, пока .getJSON() не завершится.

https://jsfiddle.net/uva5o10d/

Посмотрите здесь, я сделал вам пример, чтобы продемонстрировать, что я имею в виду, я просто заполняю массив значениями (все единицы для этого примера) и устанавливаю функцию обратного вызова с помощью setTimeout ( это задерживается на 1 с), однако обратите внимание, программа продолжит работу. (Event-l oop)

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

Закомментируйте test() и раскомментируйте working(), и вы увидите другое, вы можете использовать console.log(value + " " + oke) внутри своего .getJSON, чтобы получить результаты, которые вы ищет.

Также примечание, forEach, вероятно, будет лучшим методом для итерации по массиву, если вам не нужен обратно преобразованный массив (map).

Я приложил некоторые ресурсы, которые, я думаю, могут оказаться полезными:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...