Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用蓝鸟承诺,我如何做一个嵌套的每个?_Javascript_Asynchronous_Promise_Bluebird - Fatal编程技术网

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
。在所有对上也是公平并发的(可以是
。每个
都是顺序的)。