2016-12-19 6 views
1

Я ищу эффективный способ в Bluebird (или, по необходимости, на основе Promise), чтобы запустить параллельный массив обещаний и вернуть их по мере их завершения. Наверное, почти как блокировка очереди.Параллельный возврат обещаний в порядке

Итак, если у меня есть массив из 5 функций, функция 1 может принимать 150 мс, функция 2 может принимать 50 мс, функция 3 может принимать 50 мс и т. Д. Все 5 функций вызывают параллельно, но возвращаемые значения обратного вызова будут отвечать только в заказ, который я укажу. В идеале что-то вроде этого:

Promise.parallelLock([ 
    fn1(), 
    fn2(), 
    fn3(), 
    fn4(), 
    fn5() 
]) 
.on('ready', (index, result) => { 
    console.log(index, result); 
}) 
.then(() => { 
    console.log('Processed all'); 
}) 
.catch(() => { 
    console.warn('Oops error!') 
}); 

Я думаю, что смогу выполнить это с помощью сопрограмм Bluebird? Просто возникают проблемы с выбором структуры, которая имеет наибольшее значение/больше всего соответствует моему приведенному выше примеру.

ответ

3

Это просто Promise.all, который только ждет все обещания, обещания, как значение - если у вас есть обещание действие уже выполняется:

Promise.all([ 
    fn1(), 
    fn1(), 
    fn1(), 
    fn1(), 
    fn1(), 
    fn1(), 
    fn1() 
]) 
.then(results => { 
    // this is an array of values, can process them in-order here 
    console.log('Processed all'); 
}) 
.catch(() => { 
    console.warn('Oops error!') 
}); 

Если вам нужно знать, когда один будет сделано, вы может .tapthen, который не изменяет возвращаемое значение) them through .map before passing them to .all`:

Promise.all([ 
    fn1(), 
    fn1(), 
    fn1(), 
    fn1(), 
    fn1(), 
    fn1(), 
    fn1() 
].map((x, i) => x.tap(v => console.log("Processed", v, i)) 
.then(results => { 
    // this is an array of values, can process them in-order here 
    console.log('Processed all'); 
}) 
.catch(() => { 
    console.warn('Oops error!') 
}); 
+0

Хммм, так .TAP() будет выполняться только в той последовательности, что я указал? Итак, если fn5() заканчивается первым, он будет ждать, пока fn1-4 не будут завершены, следовательно, сохранив мою последовательность? Если это так ... хорошо, это было легко: -p – ddibiase

+0

'tap' не будет, если вы хотите, чтобы он последовал так, вы можете' .each' '.taps' вместо' .map' их. 'Promise.each ([fn1(), ....], x => x.tap (...))' (с bluebird или с '.reduce' в других библиотеках обещаний. –

+0

Это не правда net me результат, на который я надеюсь? – ddibiase