【发布时间】:2018-02-17 09:01:28
【问题描述】:
我正在整理一个承诺链,对此很抱歉。我想要做的是,对于任何特定功能中的任何错误,我想等待一秒钟再试一次,直到它成功,然后按照原始计划继续使用承诺链。
我尝试了一个 if 语句,如果有错误消息则再次调用该函数,如果没有则解决,但这不会继续成功的 Promise 链。
然后我设计了一个解决方案,其中包含一个内置到函数中的 for 循环,如下所示:
var firstMethod = function() {
var promise = new Promise(function(resolve, reject){
setTimeout(function() {
console.log('first method completed');
resolve();
}, 1000);
});
return promise;
};
var secondMethod = function(someStuff) {
var promise = new Promise(function(resolve, reject){
for(let randomNumber ; randomNumber < .9||randomNumber == null ; )
{
setTimeout(function() {
randomNumber = Math.random();
console.log('the number wasn\'t big enough');
if (randomNumber>.9)
{
console.log("got a number big enough");
resolve();
}
}, 1000)
}
});
return promise;
};
var thirdMethod = function(someStuff) {
var promise = new Promise(function(resolve, reject){
setTimeout(function() {
console.log('third method completed');
resolve();
}, 1000);
});
return promise;
};
firstMethod()
.then(secondMethod)
.then(thirdMethod);
它完成了 firstMethod,然后在我尝试运行它时挂起。如果我在 secondMethod 中注释掉 setTimeout 它可以工作,但我觉得这并没有模拟我想要使用它的真实案例场景。
我哪里错了?有没有更好的方法来循环中间承诺链,直到达到特定结果,然后继续使用承诺链?
【问题讨论】:
-
for 循环将永远运行。
setTimeout(resolve, 10000 * Math.random())呢? -
异步“循环”总是需要递归。您的
for循环会立即运行。 -
最简单的解决方案是使用带有简单循环的
async/await语法。只为setTimeout做出承诺 - 永远不要在new Promise回调中添加任何逻辑!
标签: javascript node.js