javascript - 用 Bluebird 链接递归 promise

标签 javascript recursion promise bluebird

我有一个 promise 链,中间有一个递归 promise doAsyncRecursive(),如下所示:

doAsync().then(function() {
    return doAsyncRecursive();
}).then(function() {
    return doSomethingElseAsync();
}).then(function(result) {
    console.log(result);
}).catch(errorHandler);

doAsyncRecursive() 必须做一些事情,如果一开始没有成功,我之后想每 5 秒尝试一次,直到它成功。这是我的 promise 函数的样子:

function doAsyncRecursive() {
    return new Promise(function(resolve, reject) {
        //do async thing
        if (success) {
            resolve();
        } else {
            return new Promise(function(resolve, reject) {
                setTimeout(function() {
                    doAsyncRecursive();
                }, 5000);
            });
        }
    });
}

但是当我执行时,链在第二次尝试 doAsyncRecursive() 成功并且调用 resolve() 后不会继续(如果尝试是它会继续然而,第一次尝试成功)。

我需要什么样的模式才能完成这项工作?

最佳答案

捕获失败,等待五秒钟,然后重试。

function doAsyncRecursive() {
    return doAsyncThing().catch(function() {
        return Promise.delay(5000).then(doAsyncRecursive);
    });
}

这里的doAsyncThing是对应OP代码中的//do async thing注释的函数,定义为返回一个promise。在原始代码中,使用 success 标志测试“做异步事情”的成功或失败,但根据定义,异步例程不会传递这样的标志;他们通过回调或 promise 来交付结果。上面的代码假定 doAsyncThing 返回一个 promise 。它还假设“失败”,在“没有返回我想要的响应”的意义上,由拒绝 promise 表示。相反,如果将“成功”或“失败”定义为已实现 promise 的某些特定值,那么您会想要做

function doAsyncRecursive() {
    return doAsyncThing().then(function(success) {
        if (success) return success;
        else return Promise.delay(5000).then(doAsyncRecursive);
    });
}

关于javascript - 用 Bluebird 链接递归 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30938737/

相关文章:

python - 在不改变列表的情况下在 Python 中递归打印列表

node.js - ES5,如何在循环中使用 Promise

javascript - 购物车,显示总数的功能。 [JS]

javascript - PhoneGap 外部主机通配符

javascript - 表单提交按钮 onclick 不调用我的 JS 函数

Java递归: Why won't my recursion method call back to itself?

java - 使用递归计算要打印的内容的数量

javascript - 做一些 ajax 并使用 getJSON 返回一个 promise

javascript - 使用 Q promise 库不按顺序执行 Promise 链

javascript - Q Promise onError 从未被调用