使用 bluebird Promises,如何嵌套每个?
Using bluebird Promises, how can I do a nested each?
我有 2 个数组,我想对它们的每个组合做一些事情。例如:
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 Promises 执行此操作?
我在这里使用 async
模块,因为 doProcessing
是一个异步调用。
首先关于doProcessing
承诺一下:
process = Promise.promisify(doProcessing);
如果您已经包含了 bluebird,那么在这种情况下使用回调是没有意义的。
现在它 returns 是一个承诺,您可以轻松地使用它。至于问题的另一部分,您需要所有对 - 您可以将其重构为异步嵌套 for 循环:
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));
我有 2 个数组,我想对它们的每个组合做一些事情。例如:
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 Promises 执行此操作?
我在这里使用 async
模块,因为 doProcessing
是一个异步调用。
首先关于doProcessing
承诺一下:
process = Promise.promisify(doProcessing);
如果您已经包含了 bluebird,那么在这种情况下使用回调是没有意义的。 现在它 returns 是一个承诺,您可以轻松地使用它。至于问题的另一部分,您需要所有对 - 您可以将其重构为异步嵌套 for 循环:
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));