使用蓝鸟承诺的 while 循环 [英] While loop using bluebird promises

查看:21
本文介绍了使用蓝鸟承诺的 while 循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 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());
    });
}

在这里,predicateaction 都可以返回 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆