使用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来返回的承诺。 直到doRecursion
parsing为承诺以外的值时,才会调用底部的callback函数。 在这种情况下,它最终将以'done!'
的值解决'done!'
。
也就是说,如果你正在使用承诺,你可能根本不需要使用recursion。 你可能不得不重构你的代码,但我build议考虑@ BenFortune的答案作为替代。