передача массивов функций в асинхронную параллель - PullRequest
4 голосов
/ 27 июня 2011

мне нужно передать массив функций в модуль async.js для node.js.
нормальный путь из документов будет:

async.parallel([
    function(callback){
        setTimeout(function(){
            callback(null, 'one');
        }, 200);
    },
    function(callback){
        setTimeout(function(){
            callback(null, 'two');
        }, 100);
    },
],
// optional callback
function(err, results){
});

iпопробовал так:

            for(var i = 0; i < jsonData.length; i++)
            {
                ...
                o.url = serviceurl;
                o.title = jsonData[i];
                var ff = function(callback){
                    obj.loadService(o.title,o.url,callback);
                }
               callItems.push(ff(function(){return true;}));
            }

            async.parallel(
            callItems,
                // optional callback
                function(err, results){
                    console.log('all calls called without any errors');
                });

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

что я здесь пропускаю?

1 Ответ

5 голосов
/ 28 июня 2011

Похоже, что замыкания неправильно сформированы в цикле for. Попробуйте внешнюю функцию, которая возвращает значение, которое вы в настоящее время присваиваете ff. Пример:

for(var i = 0; i < jsonData.length; i++)
{
    ...
    o.url = serviceurl;
    o.title = jsonData[i];
    var ff = makeCallbackFunc(obj, o.title, o.url);
    callItems.push(ff(function () {return true;}));
}

function makeCallbackFunc(obj, title, url) {
    return function (callback) {
      obj.loadService(title, url, callback);
    };
}

Меня немного смущает то, что вы добавляете в элементы вызова, а именно - результат вызова ff с параметром функции - это не будет обратным вызовом, оно будет выполнено сразу.

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