连续执行Promise.all

我有一个数组,其中包含承诺数组,每个内部数组可以有4k,2k或500个承诺。

总共有大约60K的承诺,我也可以用其他值来testing它。

现在我需要执行Promise.all(BigArray[0])

一旦第一个内部数组完成,我需要执行下一个Promise.all(BigArray[1])等等。

如果我尝试执行一个Promise.all(BigArray)它的投掷:

致命错误call_and_retry_2分配失败 – 进程内存不足

我需要执行它的每个承诺串联,而不是并行,我认为这是什么节点它在做什么。 我不应该使用新的库,但是我愿意考虑答案!

编辑:

以下是一段代码示例:

 function getInfoForEveryInnerArgument(InnerArray) { const CPTPromises = _.map(InnerArray, (argument) => getDBInfo(argument)); return Promise.all(CPTPromises) .then((results) => { return doSomethingWithResults(results); }); } function mainFunction() { BigArray = [[argument1, argument2, argument3, argument4], [argument5, argument6, argument7, argument8], ....]; //the summ of all arguments is over 60k... const promiseArrayCombination = _.map(BigArray, (InnerArray, key) => getInfoForEveryInnerArgument(InnerArray)); Promise.all(promiseArrayCombination).then((fullResults) => { console.log(fullResults); return fullResults; }) } 

Promise.all()将检查每个以并行forms传入的承诺结果,并将在第一个错误时拒绝,或在完成所有承诺时parsing。

从MDN :

Promise.all传递来自它传递的可迭代对象中所有promise的值数组。 值的数组维护原始可迭代对象的顺序,而不是承诺parsing的顺序。如果迭代数组中传递的内容不是承诺,则由Promise.resolve将其转换为一个。

如果承诺中的任何一个拒绝,那么所有的承诺立即拒绝拒绝的承诺的价值,抛弃所有其他的承诺,不pipe他们是否已经解决。 如果传递一个空数组,那么这个方法立即解决。

如果您需要执行所有的promise,那么Promise.all()方法将不适用于您的应用程序。 相反,你需要find解决你的承诺的迭代方法。 这将是困难的; node.js在本质上是asynchronous的,并且使用循环(根据我的知识和经验)不会阻塞,直到从循环中的承诺接收到响应。

编辑:

一个图书馆存在称为诺言序列节点 ,我想这可能会帮助你很多。 既然你已经有了创build的承诺,你可以把它传给你的BigArray

 promiseSeries(BigArray).then( (results) => { console.log(results); }); 

我个人认为,从60k +承诺开始的方法不仅需要大量的时间,而且还需要系统执行的资源(这就是为什么你的内存不足)。 我认为你可能要考虑一个更好的应用程序的体系结构。

Edit2,什么是承诺?

承诺表示asynchronous操作的结果 ,可以采取以下三种状态之一:

  1. 待定:承诺的开始状态
  2. 实现:成功的操作所代表的承诺的状态
  3. 被拒绝:由失败的操作表示的承诺状态

承诺是一成不变的,或拒绝的国家。 你可以链接承诺(非常适合避免重复的callback),也可以嵌套它们(当closures时)。 网上有很多很棒的文章, 这里是我发现的一个信息 。

这里回答很好callback完毕后,所有的asynchronousforEachcallback

 function asyncFunction (item, cb) { setTimeout(() => { console.log('done with', item); cb(item*10); }, 1000*item); } let requests = [1,2,3].map((item) => { return new Promise((resolve) => { asyncFunction(item, resolve); }); }) Promise.all(requests).then( // () => console.log('done') function(arr){ console.log(arr) console.log('done') } ); 

承诺库bluebird提供了一个名为Promise.map的帮助器方法,它接受一个数组的数组或承诺作为其第一个参数,并将其所有元素映射到一个结果数组,并将结果数组映射到一个结果数组。 也许你可以尝试这样的事情:

 return Promise.map(BigArray, function(innerArray) { return Promise.all(innerArray); }) .then(function(finishedArray) { // code after all 60k promises have been resolved comes here console.log("done"); }); 

但是如前所述,这仍然是消耗所有可用内存的非常资源密集的任务。