Вы не используете библиотеку 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