2016-11-13 2 views
0

Я запускаю запрос HTTP GET, используя популярный модуль узла-запроса для каждого элемента массива; затем запустить функцию в последнем элементе массива. Мой код выглядит следующим образом:.every() не ждет HTTP-запроса

const request = require('request'); 
var arr = ['John', 'Jane', 'Marry', 'Scarlet']; 
var x = 0; 
arr.every(function (i) { 
    x++; 
    /*instead of waiting for request, it adds x and moves on making x 
    3 when the first request finally runs*/ 
    request({ 
     url: 'http://localhost:8810/getLastName?firstName=' + i 
    }, function (error, response, body) { 
     //execute some code 
     if(x==arr.length){ 
      //therefore this function is run for each item in the array. 
      // it should run only once per array. 
     } 
    }) 
return true; 
}) 

Я надеялся добиться этого без написания тонны коды поэтому держать мой код красиво и аккуратно.

EDIT: Я не пытаюсь запустить его в порядке. Я не против, чтобы он работал параллельно, но я просто пытаюсь вызвать функцию один раз после завершения.

+0

Вы должны использовать обещания. http://blog.slaks.net/2015-06-10/advanced-promise-usage/ – SLaks

+0

'request()' is async. Он не блокируется. Вы должны написать свой код, используя обещания или обратные вызовы, которые отслеживают, когда выполняется каждая операция async. Вы хотите сериализовать запросы (по одному за раз) или запустить их все параллельно и просто знать, когда все будет сделано? – jfriend00

+0

Я просто хочу знать, когда все это сделано, я могу запустить эту последнюю функцию один раз. – Monstrum

ответ

0

Вместо того, чтобы использовать переменную x, используйте второй аргумент every, который является локальной для every функции обратного вызова:

arr.every(function (i, j) { 
// ... 

if (j+1==arr.length) ... 

Хотя переменная x является общей для всех итераций, каждая итерация имеет свою собственную версию j, так как он объявлен в закрытии обратного вызова. Поэтому он не даст вам проблему, с которой вы столкнулись с x.

+0

i не номер ..? i + 1 будет NaN. – Monstrum

+0

Ах да, исправлено ... – trincot