【问题标题】:One function inside parent function wont run asynchronously父函数中的一个函数不会异步运行
【发布时间】:2020-08-12 02:27:19
【问题描述】:

很抱歉无法提供工作代码,但也许很愚蠢,我有一个函数调用函数的世界,还有两个对外部 astar 路径查找器脚本的调用。我一直在移动等待的实例,.then 并解决了几天和几天,我只是无法让movePlayer(journeyPart2) 等到await movePlayer(journeyPart1) 完成。我也看过无数关于承诺的视频,但我看不出我哪里出错了。我还尝试仅在 for 循环到达其最后一个实例时才返回某些内容,但这不起作用。我真的希望这对我出错的人来说是显而易见的。不幸的是,第二个 movePlayer 函数需要不同的时间才能完成,所以我不能单独使用设置的时间间隔来对第二个 movePlayer 函数进行排队。

我实际上不需要从movePlayer 函数返回任何数据,但我知道至少必须返回承诺。如何让第二个movePlayer 函数等待?

编辑:请注意 else if 工作正常,因为 movePlayer 只被调用一次。

function movePlayer(journey) {
  return new Promise((resolve, reject) => {
    for (let i = 0; i < journey.length; i++){
      (function(i){
        window.setTimeout(function(){
          let nextX = journey[i].y;//?SWITCHED X AND Y AS ASTAR SWITCHES IN GRAPH
          let nextY = journey[i].x;//?SWITCHED X AND Y AS ASTAR SWITCHES IN GRAPH
          let fromTop = (26 + (nextX * 16) + (nextY * 16)) + "px";
          let fromLeft = (576 + (nextX * 32) - (nextY * 32)) + "px";
          document.getElementById("playerLayer").style.left = fromLeft;
          document.getElementById("playerLayer").style.top = fromTop;
        }, i * (900));
      }(i));
    }
  resolve("complete")
  reject("failure")
  })
}

function globalPathFindANDMove(cellNumEnd, levelNumEnd) {
  let cellNumStart = playerInfo.cellNow;
  let levelNumStart = playerInfo.levelNow;
  let j1Complete = false;
    if (levelNumStart != levelNumEnd) {
      (async function(){
        try {
          let journeyPart1 = await localPathFind(cellNumStart, undefined, levelNumStart)
          let journeyPart2 = await localPathFind(undefined, cellNumEnd, levelNumEnd)
          let useless = await movePlayer(journeyPart1)
          console.log(useless)
          movePlayer(journeyPart2)//this function won't wait until the function above completes
//------------------------------------------------------changePlayerLevel (levelNumEnd);-----------------------CREATE LATER
        } catch (err) {
        }
      })();
    } else if (levelNumStart == levelNumEnd) {
      let journey = localPathFind(cellNumStart, cellNumEnd, levelNumEnd);
      movePlayer(journey);
  }  
}

【问题讨论】:

  • 尝试替换自调用函数,用普通函数替换。就我的经验而言,异步自调用函数不能正常工作。
  • movePlayer 没有任何异步;它将运行setTimeoutjourney.length 次并立即解决。

标签: javascript async-await


【解决方案1】:

很难确定您要在代码中做什么,但我认为您只想等到 setTimeout 部分运行后再解决:

function movePlayer(journey) {
  return new Promise((resolve, reject) => {
    for (let i = 0; i < journey.length; i++){
      (function(i){
        window.setTimeout(function(){
          let nextX = journey[i].y;//?SWITCHED X AND Y AS ASTAR SWITCHES IN GRAPH
          let nextY = journey[i].x;//?SWITCHED X AND Y AS ASTAR SWITCHES IN GRAPH
          let fromTop = (26 + (nextX * 16) + (nextY * 16)) + "px";
          let fromLeft = (576 + (nextX * 32) - (nextY * 32)) + "px";
          document.getElementById("playerLayer").style.left = fromLeft;
          document.getElementById("playerLayer").style.top = fromTop;
          if (i === journey.length - 1) {
              resolve("complete")
          }
        }, i * (900));
      }(i));
    }
  })
}

【讨论】:

  • 这正是我想做的。我不敢相信我尝试过的所有组合都无法解决这个问题。谢谢。
猜你喜欢
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2019-11-11
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多