gpt4 book ai didi

JavaScript 递归返回一个从 Unresolved promise

转载 作者:行者123 更新时间:2023-12-03 00:37:18 24 4
gpt4 key购买 nike

在 JavaScript 中,我有一个对象数组,这些对象需要执行一些任务。我使用带有 awaitfor 循环迭代此数组,调用函数 doOneTask 返回一个 Promise

只要 doOneTask 中的代码按预期工作,就可以很好地工作。然而,这些事情常常会失败。再试一次几乎总是有帮助的。因此,我想在 JavaScript 代码中实现一个自动重试的过程。我的想法是一个递归函数:如果失败,doOneTask 会调用自身,直到最终解决了 Promise。

我的代码如下所示:

var tasks = [{label: 'task0'},{label: 'task1'},{label: 'task2'}];
async function mainFunction() {
for(let k = 0; k < tasks.length; k++) {
await doOneTask(tasks[k]);
console.log("doOneTask done for index " + k);
}
console.log("End reached!");
}

function doOneTask(task) {
return new Promise(async function (resolve,reject) {
console.log("Starting with: " + task.label);
let checkIfDoeSomeStuffWorked = await doSomeAsyncStuff();
if(checkIfDoeSomeStuffWorked == false) {
console.log(task.label + ": FAILED");
return doOneTask(task);
}
else {
console.log(task.label + ": SUCCESS");
resolve(true);
}
});
}

function doSomeAsyncStuff() {
return new Promise(function (resolve,reject) {
var myRandom = Math.random();
if(myRandom < 0.3) {
resolve(true);
}
else {
resolve(false);
}
});
}

mainFunction();

(在现实生活中,doSomeAsyncStuff是一个经常失败的后端调用。random()部分只是为了演示。实际上,我还限制了在停止脚本之前进行试验。)

但是,它不起作用。如果出现故障,脚本会在到达 SUCCESS 控制台日志后停止。我永远不会回到循环,并且循环中的下一个项目永远不会被执行。

最佳答案

您没有使用 q 库依赖项。 async 函数始终返回 Promise,因此您可以大大简化代码 -

async function doOneTask (task) {
const result = await doSomeAsyncStuff()
if (result === false) {
console.log(`${task} failed`)
return doOneTask(task)
}
else {
console.log(`${task} passed`)
return true
}
}

你的假函数doSomeAsyncStuff也可以被清理 -

async function doSomeAsyncStuff () {
return Math.random() < 0.3
}

但是让我们添加 1 秒的假延迟,以便我们可以显示 100% 正常工作 -

async function doSomeAsyncStuff () {
return new Promise(resolve =>
setTimeout(resolve, 1000, Math.random() < 0.3)
)
}

最后,您的 main 函数使用了非常古老的循环约定。当您使用现代 JavaScript 时,您不妨使用 for-of 语法 -

async function main (tasks = []) {
for (const t of tasks) {
await doOneTask(t)
}
return "done"
}

最后我们运行程序 -

const tasks =
[ 'task0', 'task1', 'task2' ]

main(tasks).then(console.log, console.error)
// task0 failed
// task0 passed
// task1 failed
// task1 failed
// task1 passed
// task2 passed
// done

展开下面的代码片段以在您自己的浏览器中验证结果 -

async function doOneTask (task) {
const result = await doSomeAsyncStuff()
if (result === false) {
console.log(`${task} failed`)
return doOneTask(task)
}
else {
console.log(`${task} passed`)
return true
}
}

async function doSomeAsyncStuff () {
return new Promise(resolve =>
setTimeout(resolve, 1000, Math.random() < 0.3)
)
}

async function main (tasks = []) {
for (const t of tasks) {
await doOneTask(t)
}
return "done"
}

const tasks =
[ 'task0', 'task1', 'task2' ]

main(tasks).then(console.log, console.error)
// task0 failed
// task0 passed
// task1 failed
// task1 failed
// task1 passed
// task2 passed
// done

关于JavaScript 递归返回一个从 Unresolved promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53608143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com