执行函数异步系列

时间:2015-05-28 07:22:37

标签: javascript node.js series

我正在尝试使用node.JS执行两个函数async series。 但我不明白这样做。

现在,我有:

功能1:

function search(client_id, callback) {
    clientRedis.keys('director:*', function (err, results) {
        results.forEach(function (key) {
            clientRedis.hgetall(key, function (err, obj) {
                //SAVE RESULT
                console.log('save');
            });
        });
    });
    callback(null, results);
}

功能2:

function range(client_id, callback) {
    //Sort my array
    callback(null, results);
}

我在这里称这个功能:

async.series([
    search(client_id),
    range(client_id);
], function (err, result) {
    console.log(err);
    console.log(result);
});

我的问题:第二个功能是在第一个功能之前执行,因为第一个功能需要更多时间。我需要结果首先使用函数2来扩展我的数组。

3 个答案:

答案 0 :(得分:0)

search(client_id)range(client_id)将立即执行,将callback参数分配给undefined,然后async.series将尝试将这些函数的结果作为一系列执行,可能会失败,因为那些不是函数,而是undefined。或者更确切地说,如果函数没有尝试undefined(null, results),那就会。{/ p>

请注意,如果f是一个函数,f(...)会执行它。您需要将函数本身传递给async.series,而不是将其执行结果。

async.series希望您传入任务的数组或对象,每个任务都是function(callback) { ... }

因此,以下内容应该有所帮助:

async.series([
     function(callback) { search(client_id, callback); },
     function(callback) { range(client_id, callback); }
]...)

如果您在Haskell中写作,支持currying,那么您的代码就是正确的;但在JavaScript中,f(x)(y)f(x, y)不同。

你也不要从Redis成功函数中调用callback,这也会弄乱你的时间。

答案 1 :(得分:0)

您应该使用async.waterfall代替async.series来获取第二个函数中的第一个函数结果。

  

运行函数的tasks数组,每个函数将结果传递给数组中的下一个。但是,如果任何任务将错误传递给它们自己的回调,则不执行下一个函数,并立即调用主回调并显示错误。

而且,您的代码中存在重大错误。如果我理解你的代码,你想在修改所有结果后转到第二个函数并返回第二个函数吗?在这种情况下,请使用async.each代替result.forEach并在异步后调用回调:

function search(client_id, callback) {
    clientRedis.keys('director:*', function (err, results) {
        var savedElems = [];
        async.each(results, function (key, done) {
            clientRedis.hgetall(key, function (err, obj) {
                if (err) {
                    return done(err);
                }
                savedElems.push(obj);
                done();
            });
        }, function (err) {
            if (err) {
                return callback(err);
            }
            callback(null, savedElems);
        });
    });
}

答案 2 :(得分:0)

如果您不直接使用第二个函数的结果(仅通过redis),您可以使用以下内容:

async.series([
    search.bind(null, client_id),
    range.bind(null, client_id)
], function (err, results) {
    console.log(err);
    console.log(results[0]); // for search results
    console.log(results[1]); // for range results
});