【问题标题】:Multiple objects in async pipeline异步管道中的多个对象
【发布时间】:2017-07-08 01:36:33
【问题描述】:

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

管道:

collect => clean => merge

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

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

谁能指出这个案例的设计模式?

【问题讨论】:

  • 我认为您可以为此使用 Node.js 流。如果数据是逐部分收集的,这将是一件好事。或者您可以为此使用 RabbitMQ 或其他队列。如果您提供一些代码,将更容易找到合适的解决方案。
  • 我也经常回到流媒体,我会进行更多调查。与此同时,我提出了一个“装饰者”的概念:github.com/lipsumar/promise-pipeline/blob/master/index.js

标签: node.js asynchronous pipeline


【解决方案1】:

看起来你需要的是 map/reduce。 Promise 库以及async 提供了map/reduce 方法。下面的示例使用 bluebird 承诺。这些函数使用 bluebird.resolve 将结果转换为 Promise,在您的情况下,您将有一些返回 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"}
});

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 2023-03-29
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多