【问题标题】:Plain JavaScript + bluebird promises asynchronous for/while loop WITHOUT USING NODE.JS纯 JavaScript + bluebird 承诺异步 for/while 循环而不使用 NODE.JS
【发布时间】:2015-05-29 12:42:39
【问题描述】:

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

【问题讨论】:

  • 节点是纯js。 (另外,您的链接没有节点引用)
  • 抱歉,我不使用 node.js - 你是在告诉我 .method() 和 process.nextTick() 可以作为 node.js 之外的 js 函数使用吗?
  • 我不知道promise.method() 是什么,或者你在哪里看到的。 (也没有在链接中)
  • 谢谢 - 因为我不使用 node.js 我也不知道,但它被用于 Bergi 对此的回答:stackoverflow.com/questions/24660096/… - 这是我见过的最有用的答案- 但仍然在 node.js ...
  • @user3306881:不,我确实在我的回答中使用了节点 js。我的帖子仅包含示例中的db.getUserlogger.log 以及console 对象,而不是promiseWhile 解决方案。只有 OP 在他的 question 中使用了process.nextTick - 没有明显的原因。

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


【解决方案1】:

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

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

【讨论】:

  • @user3306881 刚刚添加了一个 jsfiddle,因此您可以在浏览器中试用。
  • 我得到 Uncaught TypeError: Promise.try is not a functionwhileLoop @ promise loops v3.html:32initialize @ promise loops v3.html:17 - 有什么想法吗?
  • @user3306881 你没有包含 bluebird - 包含 bluebird 作为脚本。
  • 抱歉没有看到小提琴的链接?
  • 我的脑袋有: 即不是与使用 node.js 加载相同
猜你喜欢
  • 2015-09-15
  • 2015-04-19
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多