2015-02-18 2 views
2

У меня есть 2 массива, и я хочу сделать что-то для каждой комбинации из них. Например:Использование bluebird Promises, как я могу вложить каждый из них?

var array1, array2; 

array1 = [1, 2, 3]; 

array2 = [4, 5, 5]; 

async.each(array1, function(val1, cb1) { 
    return async.each(array2, function(val2, cb2) { 
    return doProcessing(val1, val2, function(err) { 
     return cb2(err); 
    }); 
    }, function(err) { 
    return cb(err); 
    }); 
}, function(err) { 
    return console.log('DONE'); 
}); 

Как я могу это сделать с обещаниями bluebird?

Здесь я использую модуль async, потому что doProcessing является асинхронным вызовом.

+0

Обновлен JavaScript вместо CoffeeScript – Shamoon

+0

Какая версия узла/И.О. вы используете? –

ответ

3

Прежде всего о doProcessing promisify его:

process = Promise.promisify(doProcessing); 

Там нет смысла в работе с обратными вызовами в этом случае, если у вас уже есть Блюберд включены. Теперь он возвращает обещание, и вы можете легко с ним работать. Что же касается другой части вопроса вам нужно все пары - вы можете реорганизовать, что на асинхронном вложен цикл:

return Promise.each(array1, function(val1){ 
    return Promise.each(array2, function(val2){ 
      return process(val1, val2); 
    }); 
}).then(function(){ 
    // all done 
}); 

Заметим, что если массивы содержат только цифры сделать нормальный цикл, а не обещания - каждый полезен здесь, в случае, если сами значения получены из асинхронного источника.

В качестве альтернативы - вот это более функциональный способ с Ramda:

var all = Promise.all.bind(Promise); 
var wait = R.compose(all, R.map(all), R.xprod); 
wait(arr1, arr2).map(R.apply(process)); 
+0

+1 для пути Рамды, хотя я не уверен, как это работает. Разве это не должно быть «все (R.map (все, R.map (R.map (процесс), R.xprod (arr1, arr2))))'? – Bergi

+0

@ Bergi zen of Ramda - это то, что все по умолчанию берется, а данные передаются последним. То, что ждет здесь (упрощенно), создает функцию, которая сначала получает кросс-продукт, а затем сопоставляет результат с 'all', эффективно ожидающим каждый массив. Этот разговор велик, давая интуицию для этого стиля программирования. Http://www.youtube.com/watch?v=m3svKOdZijA –

+0

О, у меня уже есть интуиция, но я говорю, что 'all' нужно выполнить * после * «процесс»? – Bergi

Смежные вопросы