我已經檢查了 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/395848.html
標籤:javascript 节点.js es6-promise 苹果-musickit-js
