2017-02-18 24 views
0

Я строю трубопровод (с nodeJS), и я наткнулся на случай, если я не знаю, как лучше всего решить:несколько объектов в асинхронном трубопровода

Трубопровод:

collect =>clean = >merge

collect будет извлекать много ресурсов и, когда это будет сделано, передать его clean. Проблема в том, что вывод collect - это список, но вход clean - это отдельный элемент.

Дело в том, что clean не нужно знать, что мы обрабатываем список предметов, ему нужно только очистить один элемент и вернуть его. Также полный список элементов станет очень большим, поэтому простое решение итерации их в clean даже не выполнимо.

Может ли кто-нибудь указать на шаблон дизайна для этого случая?

+0

Я думаю, вы могли бы использовать потоки Node.js для этого. Это было бы хорошо, если бы данные поступали из сбора по частям. Или вы можете использовать RabbitMQ или другую очередь для этого. Если вы предоставите некоторый код, было бы легче найти правильное решение. –

+0

Я продолжаю возвращаться к потокам, я буду исследовать больше. Тем временем я придумал концепцию «декоратора»: https://github.com/lipsumar/promise-pipeline/blob/master/index.js – lipsumar

ответ

0

Похоже, что вам нужна карта/сокращение. Библиотеки Promise, а также async предоставляют методы для map/reduce. В приведенном ниже примере используются обещания bluebird. Функции используют bluebird.resolve, чтобы превратить результаты в обещания, в вашем случае у вас будут асинхронные вызовы функций, которые возвращают обещания. В этом примере «очистка» - это просто нарезка строки, и объединение объединяет результат в объект.

'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"} 
});