javascript - 如何让我的异步函数等待一切?

标签 javascript async-await

如果我运行 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。也无需混合 .thenawait。将你有希望的计时器变成:

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/

相关文章:

javascript - 为什么 getScript 不能从外部脚本运行?

javascript - Handlebars 自定义如果等于助手不编译

javascript - 获取表中动态生成的文本字段的值和 ID

swift - 在 Swift 5.5 中编写同步和异步函数

Java异步订单

f# - 如何在普通任务(不是 Task<T>)上使用 Async.AwaitTask?

javascript - 自调用匿名函数格式之间的差异

c# - HttpClient PostAsync 不返回

c# - 等待手动创建的任务不考虑内部等待

javascript - 使用 AngularJS 将输入值从 ng-repeat 插入数组