我已经检查了 SO 上的其他执行绪,但没有一个真正回答问题,因为每个答案都忽略了我的情况所必需的内容,而且没有一个是针对 Apple Music 的。Apple API 严重基于承诺,甚至async/await
回传承诺而不是回应:( 我试图获取我所有的播放串列,但 Apple 将偏移限制设为 25,因此我必须分批执行此操作。目前我以这样的方式结束:
async function getAllP() {
let totalresult =[];
window.music.api.music("/v1/me/library/playlists").then(function(o){
let re = o.data;
totalresult.push(re.data);
if ("next" in re) {
// what to insert here?
} else {
return totalresult;
}
});
}
在多次尝试在回圈中正确创建承诺或链接它们失败后。我知道我需要一些递回函式。如果回应资料中存在关键字“next”,则该键的值是用于获取另一批播放串列的 url,因此我需要将该 url 传递给另一个 promise。但我无法设定显式 .then 链接,因为我不知道这条链有多长。在我的例子中,有 80 个播放串列,但其他用户可能有不同的数量,所以我正在努力的是如何撰写回圈/递回内部函式,totalresult
并在最后传递适当的自变量,并且没有厄运金字塔
totalresult
是一个“上”变量设计存盘所有回应物件。
uj5u.com热心网友回复:
希望这能解决你的问题,
const getAll = async () => {
const totalResult = [];
const getP = async (url) => {
const { data } = await window.music.api.music(url);
const hasMore = "next" in data;
totalResult.push(...data);
if (hasMore) return getP(data.next.url);
};
const url = "/v1/me/library/tracks";
await getP(url);
return totalResult;
};
uj5u.com热心网友回复:
我不确定回应资料的样子。我猜你看起来像下面这样:
注意:您可以自己处理错误。
async function getAllP() {
const totalresult = [];
let url = "/v1/me/library/playlists";
while (true) {
const o = await window.music.api.music(url);
const re = o.data;
totalresult.push(re.data);
if ("next" in re) {
url = re.next.url; // assume there is a url in the next.
continue;
}
break;
}
return totalresult;
}
0 评论