Plain JavaScript + bluebird 承诺不使用 NODE.JS 异步 for/while 循环
Plain JavaScript + bluebird promises asynchronous for/while loop WITHOUT USING NODE.JS
关于如何使用 bluebird promises 从 for / while 循环调用异步函数的问题似乎有很多答案,但据我所知,所有答案都需要 node.js 才能工作(例如 promise.method() 或 process.nextTick() ;例如: )。有没有办法在普通的 js + blue bird 中做到这一点?谢谢你的时间。
好吧,一旦某些东西是承诺返回函数——你并不真正关心库为你处理它的环境:
Promise.delay(1000); // an example of an asynchronous function
参见 this question 将函数转换为 promise 返回函数。
现在,一旦你有了那种函数,循环就变得非常简单了:
function whileLoop(condition, fn){
return Promise.try(function loop(val){
return Promise.resolve(condition()).then(function(res){
if(!res) return val; // done
return fn().then(loop); // keep on looping
});
});
}
哪个会让你做这样的事情:
var i = 0;
whileLoop(function(){
return i < 10; // can also return a promise for async here
}, function body(){
console.log("In loop body");
i++;
return Promise.delay(1000);
}).then(function(){
console.log("All done!");
});
为了演示这在浏览器中的工作原理 - 这里是 JSFiddle
关于如何使用 bluebird promises 从 for / while 循环调用异步函数的问题似乎有很多答案,但据我所知,所有答案都需要 node.js 才能工作(例如 promise.method() 或 process.nextTick() ;例如:
好吧,一旦某些东西是承诺返回函数——你并不真正关心库为你处理它的环境:
Promise.delay(1000); // an example of an asynchronous function
参见 this question 将函数转换为 promise 返回函数。
现在,一旦你有了那种函数,循环就变得非常简单了:
function whileLoop(condition, fn){
return Promise.try(function loop(val){
return Promise.resolve(condition()).then(function(res){
if(!res) return val; // done
return fn().then(loop); // keep on looping
});
});
}
哪个会让你做这样的事情:
var i = 0;
whileLoop(function(){
return i < 10; // can also return a promise for async here
}, function body(){
console.log("In loop body");
i++;
return Promise.delay(1000);
}).then(function(){
console.log("All done!");
});
为了演示这在浏览器中的工作原理 - 这里是 JSFiddle