如何使用 Q.js 在循环中执行异步函数

Posted

技术标签:

【中文标题】如何使用 Q.js 在循环中执行异步函数【英文标题】:How to execute asynchronous functions in a loop using Q.js 【发布时间】:2013-10-17 04:50:46 【问题描述】:

我需要在循环中执行一个异步函数(使用不同的参数)。任何想法如何使用 Node.js 中的 Q 模块来完成。 下面是一个例子:-

function addAsync(a, b) 
    var deferred = q.defer();
    // Wait 2 seconds and then add a + b
    setTimeout(function() 
        deferred.resolve(a + b);
    , 2000);
    return deferred.promise;

Q.all 可以使用(),但它是并行运行的。由于项目要求,我基本上需要按顺序执行它们。

【问题讨论】:

【参考方案1】:

如果您不必坚持使用 Q.js,我建议您查看 async。

Async 是一个流行的异步流控制库,它提供了大量有用的函数,包括像 series 或 waterfall 这样的函数,它们完全可以满足您的需要。谢谢:)

【讨论】:

【参考方案2】:

你有很多选择,但这应该会让你感动:

parameters.reduce(function (results, parameters) 
    return results.then(function () 
        return addAsync(parameters[0], parameters[1])
        .then(function (result) 
            results.push(result);
            return results;
        )
    );
, Q([]))
.then(function (results) 
    // ...
)
.done()

我在 Q-IO https://github.com/kriskowal/q-io/pull/57 中有一个更有趣的解决方案@

Reader(parameters)
.map(function (parameters) 
    return addAsync(parameters[0], parameters[1])
, null, 1)
.all()
.then(function (results) 
    // ...
)

1 是并行限制器。

【讨论】:

以上是关于如何使用 Q.js 在循环中执行异步函数的主要内容,如果未能解决你的问题,请参考以下文章

Q.js:如何在 Q.js 中重写异步系列流程?

Q.js:如何在 Q.js 中重写异步系列流程?

如何在异步函数中并行化 for 循环并跟踪 for 循环执行状态?

如何在 javascript 中同步异步映射函数

如何在遍历一系列目录的循环中使用异步 readdir 函数?

如何在异步函数 discord.js 中使用 message.react() 中的循环