javascript - 在多个 API 请求后如何解决一个 Promise?
问题描述
我正在尝试通过对 Spotify 的循环 API 请求来创建一个承诺。Spotify 的工作方式使我一次只能获得 100 首曲目,因此我检查是否还有更多曲目并重新运行该功能,直到所有曲目都附加到“项目”列表中。现在,承诺在 1 个请求后解决,但我需要在所有请求完成后解决。我的代码:
function getItems(myUrl) {
return new Promise((resolve, reject) => {
let items = []
request.post(authOptions, function(error, response, body) {
if (!error && response.statusCode === 200) {
// use the access token to access the Spotify Web API
var token = body.access_token;
var options = {
url: myUrl,
headers: {
'Authorization': 'Bearer ' + token
},
json: true
};
request.get(options, function(error, response, body) {
if (error) return reject(error);
for (var item of body['items']) {
items.push(item)
}
if (response.body.next != null) {
getItems(response.body.next)
}
resolve(items)
})
} else {
reject(error)
}
})
return items
})
}
getItems('https://api.spotify.com/v1/playlists/1vZFw9hhUFzRugOqYQh7KK/tracks?offset=0')
.then(res => console.log(res))
解决方案
尝试使用异步/等待。我无法调试我的代码,因为我没有 Spotify 访问权限。但我希望它可以帮助你理解想法。
async function getItems(url) {
var items = [];
async function getData(url, items) {
return new Promise((resolve, reject) => {
request.post(authOptions, function(error, response, body) {
if (error || response.statusCode !== 200) reject(error);
var token = body.access_token;
var options = {
url: url,
headers: {
'Authorization': 'Bearer ' + token
},
json: true
};
request.get(options, function(error, response, body) {
if (error) return reject(error);
for (var item of body['items']) {
items.push(item)
}
if (response.body.next == null) {
resolve([items, null])
} else {
resolve([items, response.body.next])
}
})
})
})
}
while (url) {
var response = await getData(url, items);
items = response[0];
url = response[1];
}
return items;
}
const myUrl = 'https://api.spotify.com/v1/playlists/1vZFw9hhUFzRugOqYQh7KK/tracks?offset=0';
async function main() {
const items = await getItems(myUrl);
console.log('Result: ' + items)
}
main();
推荐阅读
- node.js - 猫鼬中需要路径
- sql - Neo4j Cypher - 等效于 ADD_DATE(date,INTERVAL expr unit)
- azure - Azure Service Fabric:重新部署后台服务时出现超时错误
- spring-boot - 排除微服务的某些组件
- javascript - 设置在对象嵌套 3 级深
- r - 重新排序 ggplot2 geom_bar 中的因子计数数据
- excel - VLOOKUPNTH 单元格显示“#value”
- java - 不断收到 InputMismatchException
- ionic-framework - 选项卡数据未在 ionic 4 中加载动态数据
- haskell - 为什么 Haskell 中的 Functor 类不包含对象函数?是“纯”那个功能吗?