Как правильно организовать вызов асинхронной функции?

Рейтинг: 0Ответов: 1Опубликовано: 03.05.2015

Есть некоторая функция, у нее есть параметры, как правильно организовать её вызов в цикле с разными параметрами (на каждой итерации - новые параметры)?

Абстрактный пример:

while(id < N){
  bd.request('users.get', {'user_id' : id}, function(_o) {
    console.log(_o);
  });
id++;
}

Делаю так - виснет (циклится). Подскажите, пожалуйста.

Ответы

▲ 1

Или с помощью сторонней библиотеки, например, async.

var async = require("async");
var calls = [];
while(id < N){
  calls.push(bd.request.bind(bd, 'users.get', {'user_id' : id++}));
}
async.series(calls, function(err, results){
  //тут работаете с результатами
});

Или с помощью Promise (в node 0.12+ появилась их родная поддержка, для более старых версий можно воспользоваться сторонней библиотекой)

function request(path, data){
  return new Promise(function(resolve, reject){
    bd.request(path, data, function(err, res){
      if(err) return reject(err);
      resolve res;
    });
  });
}

var calls = [];
while(id < N){
  calls.push(request('users.get', {'user_id' : id++}));
}
Promise.all(calls).then(function(results){
  //тут работаете с результатами
});