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

时间:2015-05-29 12:42:40

标签: javascript for-loop while-loop promise bluebird

关于如何使用bluebird promises从for / while循环调用异步函数的问题似乎有很多答案,但据我所知,所有都需要node.js才能工作(例如promise.method()或process.nextTick();例如:While loop using bluebird promises)。有没有办法在普通的js +蓝鸟中做到这一点?谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

好吧,一旦某个东西是一个承诺返回功能 - 你并不真正关心图书馆为你处理它的环境:

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

有关将函数转换为承诺返回函数的信息,请参阅this question

现在,一旦你拥有了这种功能,循环变得非常简单:

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