3 回答

TA貢獻1797條經驗 獲得超6個贊
在大多數情況下,return和之間沒有可觀察到的差異return await。這兩個版本的delay1Second觀察行為完全相同(但根據實現的不同,該return await版本可能會使用更多的內存,因為Promise可能會創建一個中間對象)。
但是,正如@PitaJ指出的,在一種情況下存在差異:如果returnor return await嵌套在try- catch塊中??紤]這個例子
async function rejectionWithReturnAwait () {
try {
return await Promise.reject(new Error())
} catch (e) {
return 'Saved!'
}
}
async function rejectionWithReturn () {
try {
return Promise.reject(new Error())
} catch (e) {
return 'Saved!'
}
}
在第一個版本中,異步函數在返回結果之前等待被拒絕的承諾,這將導致拒絕變成異常并到達catch子句。因此,該函數將返回一個解析為字符串“ Saved!”的promise。
但是,該函數的第二個版本確實直接返回了被拒絕的承諾,而無需在async函數中等待它,這意味著不調用該catch案例,而是由調用者獲取拒絕。

TA貢獻1866條經驗 獲得超5個贊
這是一個很難回答的問題,因為在實踐中,這取決于您的編譯器(可能babel
)實際渲染的方式async/await
。清楚的是:
盡管第一個實現的鏈中可能少一個,但兩個實現的行為應相同
Promise
。特別是如果您刪除了不必要的
await
,則第二個版本將不需要編譯器提供任何額外的代碼,而第一個版本則需要。
因此,從代碼性能和調試的角度來看,第二個版本是可取的,盡管只是略微如此,而第一個版本具有一點易讀性,因為它清楚地表明它返回了承諾。
添加回答
舉報