标签:javascript recursion promise bluebird
我有一个带有递归承诺的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);
});
}
标签:javascript,recursion,promise,bluebird
来源: https://codeday.me/bug/20191008/1870493.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。