Как получить управление последовательным потоком нескольких асинхронных http-запросов и их обратных вызовов в node.js? - PullRequest
0 голосов
/ 29 марта 2012

Я пробовал это многими способами (очередь, с / без асинхронного модуля, обработчик и т. Д.), Но я не могу понять, как применить управление последовательным потоком к асинхронному HTTP-запросу и его обратный вызов.У меня есть массив URL-адресов, которые я хочу использовать для выполнения http-запросов и вставки отдельных документов в каждый ответ в коллекцию mongo db.Как только вставки закончены, я хочу перейти к следующему http-запросу.Вот где я нахожусь, но это все еще запускает все запросы http, прежде чем произойдет вставка.

var request = require('request');
var async = require('async');

var urls = ['http://getsomejson/1', 'http://getsomejson/2', 'http://getsomejson/3'];

async.forEachSeries(urls, function(url, callback) {
    // All of these requests are firing before http request callback logic is executed
    request(url, function (error, response, body) {
        async.forEachSeries(body.docs, function(doc, callback) {
            // Do the inserts for this response
            callback();
        }, function(err) {
            // handle errors
        });
    })
    callback();
}, function(err) {
    // handle errors
});

Любые предложения будут с благодарностью.

1 Ответ

2 голосов
/ 29 марта 2012

callback, переданный функции function(url, callback), - это то, что запускает следующий элемент в серии.Если вы просто вызываете его в конце так, это делает цикл, как если бы вы сделали for цикл.Вы должны вызвать этот обратный вызов в функции завершения запроса.Таким образом, после выполнения запроса он перейдет к следующему элементу.

async.forEachSeries(urls, function(url, callback) {
  // All of these requests are firing before http request callback logic is executed
  request(url, function (error, response, body) {

    async.forEachSeries(body.docs, function(doc, callback) {
      // Do the inserts for this response
      callback();
    }, function(err) {
      // handle errors

      callback();
    });
  })
}, function(err) {
  // handle errors
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...