如果我运行 putToDeath(0, 1).then(()=>{ console.log('done') }
控制台会在 之前输出
。所以我的函数不会等待一切,它会过早返回。done
>setAsyncTimeout 463
如何让它等待直到最后一个函数调用 face(exeNum, 'walk', true)
完成?
async function putToDeath(conNum, exeNum) {
let exeStartX = round(players[exeNum].x)
let exeStartY = round(players[exeNum].y)
console.log('walkTo 452')
await walkTo(conNum, window.innerWidth / 2, window.innerHeight / 2, 0.5).then(async() => {
faceAudience(conNum, 'walk')
console.log('setAsyncTimeout 455')
await setAsyncTimeout(async() => {
let exe = players[exeNum]
let direction = pointDirection(exe.x, exe.y, window.innerWidth / 2, window.innerHeight / 2)
let distance = lineLength(exe.x, exe.y, window.innerWidth / 2, window.innerHeight / 2)
let dest = getLineEndpoint(exe.x, exe.y, direction, distance - 50)
console.log('walkTo 461')
await walkTo(exeNum, dest.x, dest.y, 0.75).then(async() => {
console.log('setAsyncTimeout 463')
await setAsyncTimeout(async() => {
swingSword(exeNum)
await setAsyncTimeout(async() => {
await die(conNum).then(async() => {
await setAsyncTimeout(async() => {
face(exeNum, 'walk', false)
await setAsyncTimeout(async() => {
await walkTo(exeNum, exeStartX, exeStartY, 0.75).then(async() => {
face(exeNum, 'walk', true)
})
}, 500)
}, 500)
})
}, 750)
}, 500)
})
}, 1000)
})
}
const setAsyncTimeout = (cb, timeout = 0) => new Promise(resolve => {
setTimeout(() => {
cb()
resolve()
}, timeout)
})
最佳答案
没有必要混合回调和 Promise。也无需混合 .then
和 await
。将你有希望的计时器变成:
const setAsyncTimeout = (timeout = 0) => new Promise(resolve => {
setTimeout(() => {
resolve()
}, timeout)
});
然后将其用作:
await walkTo(conNum, window.innerWidth / 2, window.innerHeight / 2, 0.5);
faceAudience(conNum, 'walk')
console.log('setAsyncTimeout 455')
await setAsyncTimeout(1000);
swingSword(exeNum);
await setAsyncTimeout(1000);
await die(conNum);
await setAsyncTimeout(1000);
face(exeNum, 'walk', false);
await setAsyncTimeout(1000);
await walkTo(exeNum, exeStartX, exeStartY, 0.75);
face(exeNum, 'walk', true);
关于javascript - 如何让我的异步函数等待一切?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58773289/