如何解决Javascript:如何创建承诺的无限循环?
我想用Javascript编写以下伪代码:
function asyncOperation() {
return new Promise((resolve,reject) => {
....
}
}
while (true) {
result = asyncOperation()
if result is good then break the loop;
else loop again
}
我将用语言解释它:asyncOperation使用Promise,例如AJAX调用。我希望如果诺言被拒绝,那么asyncOperation将再次被调用。您知道如何用Javascript完成吗?
解决方法
如果要使用循环,则必须使用await
,因为否则,循环将永远运行,并且永远不会为异步操作提供任何周期来实际处理其完成:
while (true) {
result = await asyncOperation()
if (good result) {
break;
}
}
这当然需要在声明为async
的函数中。
在await
之前,通常的方法是使用局部函数和具有递归外观的结构(由于异步操作,递归结构不会产生任何堆栈):
function run() {
return asyncOperation().then(result => {
if (good result) {
return result;
} else {
// try again
return run();
}
});
}
run().then(result => {
console.log(result);
}).catch(err => {
console.log(err);
});
而且,通常您会在再次调用asyncOperation()
之前插入一些小的延迟,以避免重击目标服务器。而且,您将有一个超时或最大重试次数,以避免这种循环永远运行的情况。
像这样的东西就不够了吗
async function loopUntilTrue() {
let success = false;
while (!success) {
try {
await asyncOperation();
success = true;
} catch {
success = false;
}
}
}
,
我创建了一个循环函数来做到这一点
let count = 0;
function asyncOperation() {
return new Promise((resolve,reject) => {
if (count < 10) {
console.log('reject',count++);
reject();
return;
}
resolve(console.log('resolve',count));
});
}
async function loop() {
while (true) {
try {
await asyncOperation();
break;
} catch {
continue;
}
}
}
loop();
结果是这样的:
reject 0
reject 1
reject 2
reject 3
reject 4
reject 5
reject 6
reject 7
reject 8
reject 9
resolve 10
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。