2015-05-29 78 views
0

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

+1

节点是普通的js。 (另外,你的链接没有节点引用) – Amit

+0

对不起,但我没有使用node.js - 你告诉我,.method()和process.nextTick()可用作node.js之外的js函数吗? – user3306881

+0

我不知道'promise.method()'是什么,或者你看到了什么。 (也不在链接中) – Amit

回答

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!"); 
}); 

为了证明这一点的工作在浏览器中 - 这里的a JSFiddle

+0

非常感谢 - 我会试试这个 – user3306881

+0

@ user3306881刚刚添加了一个jsfiddle,以便您可以在浏览器中试用它。 –

+0

我得到Uncaught TypeError:Promise.try不是一个函数whileLoop @ promise loops v3.html:32initialize @ promise loops v3.html:17 - 任何想法? – user3306881