我正在构建一个管道(使用nodeJS),我遇到了一个案例,我不知道如何最好地解决:
管道:
collect
=> clean
=> merge
collect
将获取许多资源,完成后将其传递给clean
。问题是collect
的输出是一个列表,但clean
的输入是一个项目。
关键是clean
不需要知道我们处理项目列表,它只需要清理一个项目并返回它。此外,完整的项目列表将变得非常大,因此在clean
中迭代它们的简单解决方案甚至都不可行。
有人能指出这种情况的设计模式吗?
答案 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"}
});