异步管道中的多个对象

时间:2017-02-18 14:23:12

标签: node.js asynchronous pipeline

我正在构建一个管道(使用nodeJS),我遇到了一个案例,我不知道如何最好地解决:

管道:

collect => clean => merge

collect将获取许多资源,完成后将其传递给clean。问题是collect的输出是一个列表,但clean的输入是一个项目。

关键是clean不需要知道我们处理项目列表,它只需要清理一个项目并返回它。此外,完整的项目列表将变得非常大,因此在clean中迭代它们的简单解决方案甚至都不可行。

有人能指出这种情况的设计模式吗?

1 个答案:

答案 0 :(得分:0)

看起来你需要的是map / reduce。 Promise库以及async提供map / reduce方法。以下示例使用bluebird promises。函数使用bluebird.resolve将结果转换为promises,在您的情况下,您将有一些返回promise的异步函数调用。在这个例子中,“清理”只是切割一个字符串,合并是将结果组合在一个对象中。

'use strict';
const bluebird = require('bluebird');
const collection = ['foo', 'bar'];
const clean = (item) => {
   return bluebird.resolve(item.slice(0, 2));
}

const merge = (merged, item, index) => {
   merged[index] = item;
   return bluebird.resolve(merged);
};

bluebird.map(collection, clean).reduce(merge, {}).then((result) => {
   console.log(JSON.stringify(result));
   // {"0":"fo","1":"ba"}
});