Plain JavaScript + bluebird承诺不使用NODE.JS的异步for/while循环

Plain JavaScript + bluebird promises asynchronous for/while loop WITHOUT USING NODE.JS

本文关键字:异步 JS for 循环 while NODE JavaScript bluebird 承诺 Plain      更新时间:2023-09-26

关于如何使用蓝鸟承诺从for/while循环调用异步函数的问题似乎有很多答案,但据我所知,所有问题都需要node.js来工作(例如promise.method()或process.nextTick();例如:使用蓝鸟承诺的While循环)。有没有办法做到这一点在平原js +蓝鸟?感谢您的宝贵时间。

好吧,一旦某个东西是承诺返回函数-你并不真正关心环境库会为你照顾它:

Promise.delay(1000); // an example of an asynchronous function

参见关于将函数转换为承诺返回的函数的问题。

现在,一旦你有了这样的函数,循环就变得微不足道了:

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