使用promise的asynchronousrecursion

所以我试图把我的代码转移到“承诺世界”,并在许多地方,当我不得不与asynchronousfunction“循环” – 我只是用这种方式recursion

function doRecursion(idx,callback){ if(idx < someArray.length){ doAsync(function(){ doRecursion(++idx,callback) }); }else{ callback('done!') } } doRecursion(0,function(msg){ //... }); 

现在我正在努力把变化变成承诺的世界,而且我很困难

 var Promise = require('bluebird') function doRecursion(idx){ return new Promise(function(resolve){ if(idx < someArray.length){ doAsync(function(){ //... doRecursion(++idx) // how do i call doRecusion here.... }); }else{ resolve('done!') } }); } doRecursion(0).then(function(msg){ //... }); 

谢谢。

我会用Promise.all方法。

这样做是等到数组中的所有promise都解决了。 该映射会将asynchronous方法应用于数组中的每个项目并返回一个承诺。

 function doAsyncP() { return new Promise((resolve) => { doAsync(function() { resolve(); }); }); } Promise.all( someArray.map(doAsyncP) ).then((msg) => { //we're done. }); 

在你的recursion函数中,你可以这样做:

 ... if (idx < someArray.length) { doAsync(function() { resolve(doRecursion(idx + 1)); }); } else { ... 

换句话说,虽然idx小于someArray.length ,但您的承诺将parsing为另一个承诺,这次是通过调用doRecursion()并将idx加1来返回的承诺。 直到doRecursionparsing为承诺以外的值时,才会调用底部的callback函数。 在这种情况下,它最终将以'done!'的值解决'done!'

也就是说,如果你正在使用承诺,你可能根本不需要使用recursion。 你可能不得不重构你的代码,但我build议考虑@ BenFortune的答案作为替代。