Javascript 使用蓝鸟承诺,我如何做一个嵌套的每个?
我有两个数组,我想对它们的每一个组合做些什么。例如:Javascript 使用蓝鸟承诺,我如何做一个嵌套的每个?,javascript,asynchronous,promise,bluebird,Javascript,Asynchronous,Promise,Bluebird,我有两个数组,我想对它们的每一个组合做些什么。例如: 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(
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');
});
我如何才能做到这一点与蓝鸟的承诺
我在这里使用
async
模块,因为doProcessing
是一个异步调用。首先关于doProcessing
提示:
process = Promise.promisify(doProcessing);
如果已经包含bluebird,那么在这种情况下使用回调是没有意义的。
现在它返回一个承诺,您可以轻松地使用它。至于问题的另一部分,您需要所有对-您可以将其重构为异步嵌套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));
更新为JavaScript而不是CoffeeScript您使用的是哪个版本的node/io?+1表示Ramda方式,尽管我不确定它是如何工作的。它不需要是
all(R.map(all,R.map(R.map(process),R.xprod(arr1,arr2))
?@Bergi Ramda的禅宗是,默认情况下一切都会发生,数据会最后传递。wait在这里所做的(简化了一点)是创建一个函数,该函数首先获取叉积,然后映射结果,使用all
有效地等待每个数组。这篇演讲非常擅长为这种编程风格提供直觉哦,我已经有了直觉,但我要说的是,所有的
都需要在过程之后执行
?@Bergi[a1,a2]中的值
对于来自arr1的a1和来自arr2的a2,在将其传递到过程之前,需要将其展开
-在Ramda中从右到左进行合成。请注意,wait
的返回结果是一个bluebird承诺调用.map
,它隐式调用.all
(这不同于array#map
,在这种情况下,您的注释会被当场发现。这不同于功能性较差的版本,它首先创建所有对,然后对它们执行process
。在所有对上也是公平并发的(可以是。每个
都是顺序的)。