使用蓝鸟承诺的 while 循环 [英] While loop using bluebird promises
问题描述
我正在尝试使用 Promise 实现一个 while 循环.
I am trying to implement a while loop using promises.
这里概述的方法似乎有效.http://blog.victorquinn.com/javascript-promise-while-loop它使用了这样的函数
The method outlined here seems to work. http://blog.victorquinn.com/javascript-promise-while-loop it uses a function like this
var Promise = require('bluebird');
var promiseWhile = function(condition, action) {
var resolver = Promise.defer();
var loop = function() {
if (!condition()) return resolver.resolve();
return Promise.cast(action())
.then(loop)
.catch(resolver.reject);
};
process.nextTick(loop);
return resolver.promise;
};
这似乎使用了反模式和不推荐使用的方法,如 cast 和 defer.
This seems to use anti-patterns and deprecated methods like cast and defer.
有没有人知道一种更好或更现代的方法来实现这一目标?
Does anyone know a better or more modern way to accomplish this?
谢谢
推荐答案
cast
可以翻译成resolve
.defer
应该确实不能使用.
cast
can be translated to resolve
. defer
should indeed not be used.
您只能通过将 then
调用链接和嵌套到初始 Promise.resolve(undefined)
上来创建循环.
You'd create your loop only by chaining and nesting then
invocations onto an initial Promise.resolve(undefined)
.
function promiseWhile(predicate, action, value) {
return Promise.resolve(value).then(predicate).then(function(condition) {
if (condition)
return promiseWhile(predicate, action, action());
});
}
在这里,predicate
和 action
都可以返回 promise.对于类似的实现,还可以查看 为 promise 编写循环的正确方法. 更接近您的原始函数是
Here, both predicate
and action
may return promises. For similar implementations also have a look at Correct way to write loops for promise. Closer to your original function would be
function promiseWhile(predicate, action) {
function loop() {
if (!predicate()) return;
return Promise.resolve(action()).then(loop);
}
return Promise.resolve().then(loop);
}
这篇关于使用蓝鸟承诺的 while 循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!