我有一個基于異步的代碼庫,我需要與一些“基于回呼”的外部庫進行互動。我雖然可以用一個Promise可以充當“橋梁”的外部庫來包裝外部庫,并為我提供一個異步外觀。我最終對如何定義這個包裝器產生了疑問。在代碼中:
export function externalApi(onsuccess: (response: string) => void): void {
// stuff
onsuccess('response');
}
export async function myWrapper(): Promise<string> {
return await new Promise((resolve) => externalApi(resolve));
}
我的疑問是
- 應該
myWrapperawait承諾嗎?還是應該return立即? - 如果沒有
await,是否應該將此功能標記為async? - 寫這些
await new Promise(...)東西有什么懲罰嗎?
uj5u.com熱心網友回復:
應該
myWrapperawait承諾嗎?還是應該立即歸還?
隨你(由你決定。不需要在函式return await的頂層執行,1但通過將函式包含在異步堆疊跟蹤中可能會使異步堆疊跟蹤更清晰。所以你可能會因為這個原因保留它,或者你可能會因為這個原因洗掉它。:-) (我應該注意到,在最新的 V8 中,我無法再看到堆疊跟蹤的差異,兩者都包括包裝函式。所以這方面的事情可能已經發生了變化;我知道異步堆疊跟蹤是一個熱門開發一段時間。)asyncasync
如果沒有
await,是否應該將此功能標記為async?
不,如果您洗掉await,則沒有理由將async.
寫這個等待新的 Promise(...) 東西有什么懲罰嗎?
如果您特別指的是awaitin return await,那么不,不是當您使用的承諾await是本機承諾時。它曾經在函式承諾的解決中引入(基本上無害的)異步滴答async,但規范已更新以允許引擎避免它。
1如果你想在函式中捕獲對 promise 的拒絕,或者你想在子句中做某事,或者類似的事情——函式邏輯依賴于該 promise 的任何事情,使用return await notasync在函式的頂層是必要的在函式本身回傳之前解決。例如,您在這里需要它:finallyasyncasync
async function example() {
try {
return await somethingThatProvidesAPromise();
} catch (e) {
throw new WrapperError(e);
}
}
和這里
async function example() {
const lock = acquireLock();
try {
return await doSomethingWith(lock);
} finally {
releaseLock(lock); // (Where `releaseLock` guarantees it nevers throws)
}
}
如果沒有await.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462374.html
