function fakeRequest(url) {
return new Promise((resolve, reject) => {
delay = Math.floor(Math.random() * 4500) 500;
setTimeout(() => {
if (delay > 4500) {
resolve(url ": success")
}
else {
reject(url = ": error")
}
}, delay);
})
})
}
async function makeTwoRequests() {
let data1 = await fakeRequest("/page1");
console.log("Data 1:", data1)
let data2 = await fakeRequest("/page2");
console.log("Data 2:", data2)
}
makeTwoRequests()
當我洗掉 data1 或 data2 并且只有 1 等待它作業。但是當有 2 個或更多錯誤時,它會說:Uncaught (in promise) : error
我不知道這里發生了什么。請幫幫我
謝謝!
uj5u.com熱心網友回復:
如果你等待一個拒絕的承諾,它就會變成一個拋出的錯誤。
改變reject內部fakeRequest以解決問題,我敢打賭問題會消失。
這對我有用:
function fakeRequest(url) {
return new Promise((resolve, reject) => {
let delay = Math.floor(Math.random() * 4500) 500;
setTimeout(() => {
if (delay > 4500) {
resolve(url ": success")
} else {
resolve(url ": error")
}
}, delay);
})
}
async function makeTwoRequests() {
let data1 = await fakeRequest("/page1");
console.log("Data 1:", data1)
let data2 = await fakeRequest("/page2");
console.log("Data 2:", data2)
}
makeTwoRequests()
示例代碼還有其他幾個問題:
delay應該用關鍵字宣告,如let,const或var; 這對于保證函式的每次呼叫都使用其自己的私有版本而不是共享版本以及防止此函式更改外部范圍內的變數是必要的- 該
reject呼叫使用=而不是,它重新定義并回傳url變數,而不是將 URL 字串與文字: error字串連接起來 - 有一個額外的關閉
}),這阻止了這段代碼的決議
但我想我明白了你的意思:你試圖模擬 API 呼叫通常成功的情況,除了一些因超時而失敗的情況。
您fakeRequest 確實做到了這一點,但您的呼叫代碼無法處理該問題。為此,您需要這樣的東西:
async function makeTwoRequests() {
let data1
try {
data1 = await fakeRequest("/page1");
} catch ( error ) {
console.error(`request 1 threw`, error)
// here, you might return, or re-throw, or fall through
}
let data2
try {
data2 = await fakeRequest("/page2");
} catch ( error ) {
console.error(`request 2 threw`, error)
// here, you might return, or re-throw, or fall through
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/439973.html
標籤:javascript
