微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 用蓝鸟链接递归承诺

我有一个带有递归承诺的promise链,doAsyncRecursive()在中间,如下所示:

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

doAsyncRecursive()必须做一些事情,如果它最初没有成功,那么我想在每5秒尝试一次,直到它完成.这是我的诺言功能

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代码中执行async thing注释,定义为返回一个promise.在原始代码中,使用成功标志测试“do async thing”的成功或失败,但根据定义,异步例程不会提供这样的标志;他们通过回调或承诺提供结果.上面的代码假定doAsyncThing返回一个promise.它还假设“失败”,在“不返回我想要的反应”的意义上,由拒绝的承诺表示.如果将“成功”或“失败”定义为履行承诺的某个特定价值,那么您想要做

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐