所以我在想 ok 節點是異步的(意味著多行代碼同時執行),那么為什么我們使用關鍵字 async(字面意思是異步)來等待關鍵字 await 完成的任務(這使得它是同步的)。為什么沒有關鍵字sync,因為那是我們正在做的?有人可以解釋一下關鍵字 async 的邏輯嗎?我感到很困惑。
uj5u.com熱心網友回復:
該async關鍵字,可以使用await它只是與承諾和異步操作撰寫代碼更簡化的語法。它不會使任何同步。它只是允許您使用與同步代碼類似的編程技術,但它仍然是異步的。
有人可以解釋一下關鍵字 async 的邏輯嗎?我感到很困惑。
當你使用async關鍵字來宣告一個函式時,你正在創建一個不同型別的函式,它總是回傳一個承諾。這僅對異步編程有用 - 因此async關鍵字與術語“異步”有關。
此外,async關鍵字不會使任何同步。它確實允許您使用更類似同步的編程模型,該模型使用起來要簡單得多,特別是對于異步控制流中的條件分支之類的東西,但實際上沒有任何異步變為同步。
作為什么都不同步的示例,請在代碼片段中運行此示例并注意console.log()陳述句的順序。該async函式在遇到第一個時回傳await,其余的執行繼續進行,異步操作仍在進行。這是一個帶有計時器的模擬,但該計時器可以是任何其他異步操作,例如 http 請求、資料庫操作等...
function delay(t) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
async function run() {
console.log("in run() 1");
await delay(100);
console.log("in run() 2");
}
console.log("before run()");
run();
console.log("after run()");
通過運行這個小示例,您可以看到,run()只要您點擊,該函式的執行就會暫停,await并回傳,允許在函式呼叫后運行其他代碼。然后,稍后當計時器觸發并且delay()promise 被決議時,該run()函式會從它被掛起的地方取出并執行函式體的其余部分。
這在操作上與使用.then()代替async和的代碼相同await:
function delay(t) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
function run() {
console.log("in run() 1");
delay(100).then(() => {
console.log("in run() 2");
});
}
console.log("before run()");
run();
console.log("after run()");
uj5u.com熱心網友回復:
Node.js 不是“異步的”,而是 Node.js 有一組異步 API。
回答有關async/await - async/await 的問題只是語法糖,因為它在幕后使用了 Promise。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/362020.html
標籤:javascript 节点.js 打字稿 异步 异步等待
