javascript - 嵌套 ajax 调用的最佳实践
问题描述
我正在使用 Spotify REST API 和 JQuery 创建一个简单的应用程序,用户可以在其中找到艺术家,然后它将显示有关艺术家、相关艺术家以及页面上收听次数最多的歌曲的信息。我创建了 3 个 ajax 调用,你可以在下面看到并且一切正常,但我认为它可以用更好的方式编写(可能是承诺?)。
第一个 ajax 调用从服务器获取 id 并创建一些 DOM 元素。后两个 ajax 调用需要 id 才能运行并创建 DOM 元素。还有一个删除按钮应该删除从每个 ajax 调用的数据构建的 DOM 元素。
是否可以使用最佳实践将其嵌套,或者这是唯一可能的方法?
artistForm.submit((e) => {
e.preventDefault();
let inputSearchQuery = artistInput.val();
let searchQuery = encodeURI(inputSearchQuery);
$.ajax({
url: `${baseUrl}search?q=${searchQuery}&type=artist`,
type: 'GET',
datatype: 'json',
headers: {
'Authorization': 'Bearer ' + accessToken
}
}).done((resp) => {
const artistId = (resp.artists.items[0].id);
// working with data and appending them on DOM
$.ajax({
url: `${baseUrl}artists/${artistId}/top-tracks?country=CZ`,
type: 'GET',
datatype: 'json',
headers: {
'Authorization': 'Bearer ' + accessToken
}
}).done((resp) => {
// working with data and appending them on DOM
$.ajax({
url: `${baseUrl}artists/${artistId}/related-artists`,
type: 'GET',
datatype: 'json',
headers: {
'Authorization': 'Bearer ' + accessToken
}
}).done((resp) => {
// working with data and appending them on DOM
deleteArtist.click(() => {
// need to have acces to data from every ajax call.
})
});
});
});
});
解决方案
鉴于您的工作案例,您可以考虑以下方法:
artistForm.submit(async (e) => {
e.preventDefault();
let inputSearchQuery = artistInput.val();
let searchQuery = encodeURI(inputSearchQuery);
let artist = await $.ajax({
url: `${baseUrl}search?q=${searchQuery}&type=artist`,
type: 'GET',
datatype: 'json',
headers: {
'Authorization': 'Bearer ' + accessToken
}
});
const artistId = artists.items[0].id;
let topTracks = await $.ajax({
url: `${baseUrl}artists/${artistId}/top-tracks?country=CZ`,
type: 'GET',
datatype: 'json',
headers: {
'Authorization': 'Bearer ' + accessToken
}
});
let relatedArtists = await $.ajax({
url: `${baseUrl}artists/${artistId}/related-artists`,
type: 'GET',
datatype: 'json',
headers: {
'Authorization': 'Bearer ' + accessToken
}
});
deleteArtist.click(() => {
// need to have access to data from every ajax call.
});
});
这是假设您使用的是 jQuery 3.0 或更高版本。如果没有,您可以在这里找到一个不错的包装函数。
如果你想了解更多关于 Promise 和异步等待的信息,我推荐以下视频:JavaScript Promises In 10 Minutes - by Web Dev Simplified 和The Async Await Episode I Promised - by Fireship。
如果您对上面的代码有任何疑问,请添加评论。
我希望这可以帮助您继续您的项目(并且您在此过程中学到了一些东西)。
推荐阅读
- php - 如何使用 Woocommerce API 为产品添加变体
- html - 为什么元素 div 也会改变它的位置
- css - 创建灰度效果的不同方法和背后的原理是什么?
- javascript - 将线解方程转换为具有未知 x 和 y 的可重用 javascript 函数
- c++ - 在每个包含 3 个元素的数组中合并彼此最近的点
- swift - 转换约束时 UIView / Shadow 的奇怪行为(内部图片)
- java - 压缩多部分文件并通过 FTP 存储
- xaml - AppBarButton:如何将 2 个字形作为图标
- android - 如何从底部导航栏片段打开一些片段
- azure-maps - Azure Maps - 多边形边界框