【发布时间】: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