[英]Promise is rejected prematurely multiple times before resolving
我正在調用API,然后嘗試呈現返回數據的圖表:
function getFromAPI(url) {
return new Promise( (resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log("Resolving!");
jsonData = JSON.parse(xhr.responseText);
resolve(jsonData);
} else {
console.log("Rejecting!");
reject();
}
}
xhr.open("GET", url, true);
xhr.send();
});
}
getFromAPI(API_URL).then( (jsonData) => { drawChart(jsonData) });
當我加載該腳本時,我會被Rejecting!
在控制台中解決3次后再解決。 reject
也打破了.then
部分(即對我而言沒有圖表!)
我認為onreadstatechange
事件在觸發readyState == 4
和status == 200
之前會觸發幾次。 到底發生了什么?如何避免過早拒絕諾言?
onreadystatechange
是一個事件處理程序,只要xhr readyState
發生更改,就會觸發該事件處理程序。
0 UNSENT Client has been created. open() not called yet.
1 OPENED open() has been called.
2 HEADERS_RECEIVED send() has been called, and headers and status are available.
3 LOADING Downloading; responseText holds partial data.
4 DONE The operation is complete.
如您所見,有4種“未就緒”狀態和一種“完成”狀態。 這說明了您看到的拒絕和解決的控制台日志。
當請求“完成”時,根據狀態拒絕或解決請求:
xhr.onreadystatechange = () => {
if (xhr.readyState !== 4) {
return;
}
if (xhr.status === 200) {
console.log("Resolving!");
jsonData = JSON.parse(xhr.responseText);
resolve(jsonData);
return;
}
console.log("Rejecting!");
reject();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.