[英]Building async with setTimeout like a promise with setTimeout doesn't work
在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function他們說寫作
async function foo() {
return 1
}
和寫作一樣
function foo() {
return Promise.resolve(1)
}
所以這意味着如果我們想將一個 promise '轉換'為一個異步函數,我們必須用return promise_result
替換resolve(promise_result)
。
但是當我嘗試將setTimeout
與async
一起使用時,它不起作用:
const test1 = async () => {
setTimeout(
() => {
return 5;
},
2000,
)
}
const test2 = () => new Promise(
(resolve, reject) => {
setTimeout(
() => resolve(25),
1000
)
}
)
const execute = async () => {
const result = await test1();
console.log(result); // undefined
}
execute();
如果我在test2
上使用await
它可以工作,但它在test1
不起作用。 這是為什么 ? async/await
僅用於處理掛起的承諾而不使用.then
還是我可以使用帶有return result
async
而不是使用帶有resolve
Promise
?
它未定義,因為test1
不返回任何內容。 仔細看看你在匿名函數中返回它
const test1 = async () => { // <--- this function returns nothing back. Nothing means "undefined"
setTimeout(
() => { // <---- you return it here back in your anonymous function witch makes no sense
return 5;
},
2000,
)
}
這是一個有趣的。 這里的問題是
const test1 = async () => {
setTimeout(
() => {
return 5;
},
2000,
)
}
test1 是一個異步函數,但setTimeout
不是。
setTimeout
只會安排您傳遞的任何內容並立即返回其 timeoutID。 在這種情況下,您真的需要手動處理 Promise 代碼。
您忘記在test1
等待setTimeout
。 發生的事情是你返回一個承諾的承諾。 第一個承諾被等待,但第二個(包裝在第一個內的不是),而在test2
你直接返回一個承諾。
在打字稿中更清楚,其中test1
的類型應該是Promise<Promise<number>>
而test2
的類型應該是Promise<number>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.