【问题标题】:Await not waiting in async function [duplicate]等待不在异步功能中等待[重复]
【发布时间】:2021-08-23 10:07:55
【问题描述】:

欢迎回答我的第一个 SO 问题。我正在尝试从我的 Express 后端调用 Spotify 的 API,但我无法正确返回数据。 API 请求不是问题 - 返回了正确的信息,但我似乎无法检索该信息。

这是调用包含 API 调用的getOldTracks 函数的路由。

router.post("/remix", async (req, res) => {
  // Fetch song information
  const oldTracks = await getOldTracks(req.body.playlistId, req.user.username).then((data) => {
    console.log('returned to original call',data);
    return data;
  }).catch((err) => {console.log('this is an error',err)});

});

我最初尝试直接返回setUpSpotifyApi 函数,但它只会返回一个待处理的承诺,该承诺只会解析为未定义。我正在尝试使用trackList 来尝试查看调用的顺序。

const getOldTracks = async (playlistId, userName) => {
  let trackList = null;
  await setUpSpotifyApi(userName)
    .then((spotifyApi) => {
      spotifyApi.getPlaylist(playlistId).then(
        (data) => {
          console.log('in spotify api call',data.body.tracks.items)
          trackList = data.body.tracks.items;
         // return data.body.tracks.items;
        },
        (err) => {
          console.log("Error grabbing playlist", err);
        }
      );
    })
    .catch((error) => {
      console.log(error);
    });
  console.log('after await',trackList);
  return trackList
};

这是控制台显示的内容。这是一个没有曲目的播放列表,所以空数组是正确的

after await null
returned to original call null
in spotify api call []

我真的不明白为什么getOldTracks 返回null trackList。为什么在我指定等待 spotify 调用后它继续执行?我对异步 JS 不太熟悉,但我从来没有遇到过这样的问题。我也无法通过 Promise 解决这个问题,所以我不知道为什么它的执行顺序不正确。

【问题讨论】:

  • 当您将await.then() 混合使用时,您会遇到这种麻烦。将所有.then() 更改为使用await 并将所有.catch() 更改为使用try/catch,您的问题就会消失。您不会通过返回将您的内部承诺链接到外部承诺 - 因此外部承诺不知道内部承诺何时完成,因此无法等待。但是,如果您始终使用 await 而不是混合两种编程风格,则不必担心。
  • @jfriend00 是的,我明白你的意思。最初我试图做所有.then(),但是当我无法让它工作时,我就开始向它扔异步/等待的东西。我需要更好地学习这些东西

标签: javascript node.js express


【解决方案1】:

你必须 await 内的承诺,现在你在 spotifyApi.getPlaylist 完成之前返回

const spotifyApi = await setUpSpotifyApi(userName);
await spotifyApi.getPlaylist(playlistId).then(
    (data) => {
      console.log('in spotify api call',data.body.tracks.items)
      trackList = data.body.tracks.items;
     // return data.body.tracks.items;
    },
    (err) => {
      console.log("Error grabbing playlist", err);
    }
  );
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多