用蓝鸟链接递归承诺
chaining recursive promise with bluebird
我有一个承诺链,中间有一个递归承诺 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。在原始代码中,"do async thing" 的成功或失败使用 success
标志进行测试,但根据定义,异步例程不会传递这样的标志;他们通过回调或承诺来交付结果。上面的代码假定 doAsyncThing
returns 是一个承诺。它还假定 "failure" 在 "does not return the response i want" 的意义上由拒绝承诺表示。相反,如果要将 "success" 或 "failure" 定义为已实现承诺的某个特定值,那么您需要做
function doAsyncRecursive() {
return doAsyncThing().then(function(success) {
if (success) return success;
else return Promise.delay(5000).then(doAsyncRecursive);
});
}
我有一个承诺链,中间有一个递归承诺 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。在原始代码中,"do async thing" 的成功或失败使用 success
标志进行测试,但根据定义,异步例程不会传递这样的标志;他们通过回调或承诺来交付结果。上面的代码假定 doAsyncThing
returns 是一个承诺。它还假定 "failure" 在 "does not return the response i want" 的意义上由拒绝承诺表示。相反,如果要将 "success" 或 "failure" 定义为已实现承诺的某个特定值,那么您需要做
function doAsyncRecursive() {
return doAsyncThing().then(function(success) {
if (success) return success;
else return Promise.delay(5000).then(doAsyncRecursive);
});
}