我的理解是,異步函式是異步的。所以它不會等待所以呼叫者不會等待它完成它只是立即回傳一個將在以后解決的承諾。除非您使用await
關鍵字。
我在 nodejs 中運行這段代碼,結果出乎意料
async function foo() {
console.log('start')
let sum = 0;
for(let i = 0; i < 1000000000; i ) {
sum = 0.00001 * i;
}
console.log('finish')
return sum;
}
function main() {
foo()
console.log('this should run immediately:')
}
main()
這是我得到的結果
start
finish
this should run immediately:
這不是我期望發生的事情我希望最后一條訊息立即列印并作為“開始”和“完成”之前的第一條訊息。我不明白什么?
uj5u.com熱心網友回復:
async function foo() {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log('start')
let sum = 0;
for(let i = 0; i < 100000; i ) {
sum = 0.00001 * i;
}
console.log('finish')
resolve(sum);
}, 0)
})
}
function main() {
foo()
console.log('this should run immediately:')
}
main()
像這樣嘗試
uj5u.com熱心網友回復:
里面的代碼foo()
是完全阻塞和同步的。它不會回傳,直到它里面的代碼執行完畢。async
向函式添加關鍵字不會改變任何這些。
許多人顯然被這個async
關鍵詞搞糊涂了。它很有用(與await
并回傳 promise 的異步函式結合使用時),但是當您沒有使用 promise 的異步代碼時,它根本沒有用。
防止這個巨大for
回圈阻塞的唯一方法是將它移動到 WorkerThread 或子行程。它只是同步和阻塞,nodejs 中主執行緒的單執行緒特性意味著當該for
回圈運行時,沒有其他東西可以運行(除非它在 ??WorkerThread 或子行程中)。
您可以使用 a 將回圈的執行“推遲”到稍后的時間setTimeout()
,但是當它運行時,它仍然會阻塞和同步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399739.html
上一篇:依賴模式也應該編譯嗎?
下一篇:返回列表