首页 > 解决方案 > 异步等待不工作,控制台不返回错误

问题描述

我正在尝试使用 async await 进行 API 调用,但它不起作用并且在这里没有给出错误我正在尝试调用 getRace() 它返回一个承诺,所以我在这里使用 await 关键字:

async function RaceInfo(){
     await getRace(raceID)
}

然后我调用 RaceInfo() 并使用 then 来处理响应:

RaceInfo().then(res=>{
        if(race.status === "in-progress") {
    renderAt('#leaderBoard', raceProgress(res.positions))
        }else if(race.status === "finished"){
    clearInterval(raceInterval) // to stop the interval from repeating
    renderAt('#race', resultsView(res.positions)) // to render the results view
    
        }

然后所有这些都需要分组在一个最终的承诺中,以便在外部调用:

function runRace(raceID) {
    return new Promise(resolve => {
    // TODO - use Javascript's built in setInterval method to get race info every 500ms
    
    async function RaceInfo(){
         await getRace(raceID)
    

    }
    RaceInfo().then(res=>{
        if(race.status === "in-progress") {
    renderAt('#leaderBoard', raceProgress(res.positions))
        }else if(race.status === "finished"){
    clearInterval(raceInterval) // to stop the interval from repeating
    renderAt('#race', resultsView(res.positions)) // to render the results view
    resolve(res)
        }

}).catch((err) => {
    console.log(err);
})
    const raceInterval=setInterval(RaceInfo, 500);
})

}

控制台没有返回错误,可能是什么问题?

标签: javascriptasync-await

解决方案


您不会从 中返回任何内容RaceInfo,并且race在传递给RaceInfo().then(...)...的回调中未定义

function getRace(raceID) {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve({status: "finished"}), 300);
  })
}

function runRace(raceID) {
    return new Promise(resolve => {
      // TODO - use Javascript's built in setInterval method to get race info every 500ms

      async function RaceInfo() {
          // Added return statement
          return await getRace(raceID);
      }

      RaceInfo().then(race => { // Changed paramter name 
          if(race.status === "in-progress") {
            console.log("race in progress");
            // renderAt('#leaderBoard', raceProgress(res.positions))
          } else if (race.status === "finished") {
            console.log("race in progress");
            // clearInterval(raceInterval) // to stop the interval from repeating
            // renderAt('#race', resultsView(res.positions)) // to render the results view
            // resolve(res)
          }
    }).catch((err) => {
      console.log(err);
    })

    const raceInterval=setInterval(RaceInfo, 500);
  });
}

runRace(7);


推荐阅读