等待不在异步函数中等待

时间:2021-06-05 18:24:41

标签: javascript node.js express

欢迎来到我的第一个 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 返回空值 trackList。为什么在我指定等待 Spotify 调用后它会继续执行?我对异步 JS 不太有经验,但我从来没有遇到过这样的问题。我也无法用承诺解决这个问题,所以我不知道为什么它以错误的顺序执行。

1 个答案:

答案 0 :(得分:0)

你必须export const getTags = (element: Record < string, any > ) => Object.entries(element).reduce((acc, [key, val]) => { if (typeof key === "boolean") { acc[key] = val; } return acc; }, {}); 内在的承诺,现在你在await完成之前返回

spotifyApi.getPlaylist