节点中许多异步任务的设计模式

时间:2012-10-29 21:30:46

标签: node.js design-patterns asynchronous

我正在学习节点并编写API。我的一个API调用带有一个名为Tags的参数,它将包含逗号分隔的标记,每个标记都要保存到磁盘(我使用的是MongoDB + Mongoose)。通常当我在我的API中保存到DB时,我传递一个回调并在该回调中保存后进行,但是这里我有一个可变数量的对象要保存到磁盘,我不知道保存所有的最干净的方法这些标签到磁盘,然后保存后来引用它们的对象。任何人都可以建议使用干净的异步模式吗?谢谢!

2 个答案:

答案 0 :(得分:8)

async是用于完成这些任务的好节点库..

并行或串行运行多个异步调用,然后触发一个回调:

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

async.series([
    function(){ ... },
    function(){ ... }
]);

答案 1 :(得分:3)

当我不想要其他依赖项时,这是我经常使用的常见代码模式:

var tags = ['tag1', 'tag2', 'tag3'];
var wait = tags.length;
tags.forEach(function (tag) {
    doAsyncJob(tag, done);
});

function done() {
    if (--wait === 0) allDone();
}

此代码将为每个数组项并行运行doAsyncJob(标记,回调),并在每个作业完成时调用allDone。如果您需要连续处理数据(每个接一个),这是另一种模式:

(function oneIteration() {
    var item = tags.shift();
    if (item) {
        doAsyncJob(item, oneIteration);
    } else {
        allDone();
    }
})();