3 回答

TA貢獻1831條經驗 獲得超4個贊
我似乎無法繞開為什么這行不通的想法。
因為main回報承諾;所有async功能都可以。
在頂層,您必須:
使用async永不拒絕的頂層函數(shù)(除非您希望出現(xiàn)“未處理的拒絕”錯誤),或者
使用then和catch,或
(即將推出?。┦褂庙攲觓wait,該提案已進入允許在模塊中頂層使用的過程中的第3階段await。
#1- async永不拒絕的頂級功能
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
注意catch; 您必須處理Promise拒絕/異步異常,因為沒有其他事情要做;您沒有呼叫者將其傳遞給。如果愿意,可以在通過catch函數(shù)(而不是try/ catch語法)調用它的結果上執(zhí)行此操作:
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
...更加簡潔(出于這個原因,我喜歡它)。
或者,當然,不處理錯誤,而只允許“未處理的拒絕”錯誤。
#2- then和catch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
catch如果鏈或您的then處理程序中發(fā)生錯誤,則將調用該處理程序。(請確保您的catch處理程序不會拋出錯誤,因為沒有任何內容可以處理。)
或兩個參數(shù)then:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
再次注意,我們正在注冊一個拒絕處理程序。但是,以這種形式,請確保您的then回調都不會引發(fā)任何錯誤,也沒有任何內容可以處理。
#3頂級await模塊
您不能await在非模塊腳本的頂層使用await,但是頂層建議(第3階段)允許您在模塊的頂層使用它。這與使用頂級async函數(shù)包裝器(上面的#1)相似,因為您不希望您的頂級代碼拒絕(拋出錯誤),因為這將導致未處理的拒絕錯誤。因此,除非您要在出現(xiàn)問題時遇到未處理的拒絕,例如#1,否則您需要將代碼包裝在錯誤處理程序中:
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}

TA貢獻1811條經驗 獲得超4個贊
解決此問題的實際方法是采用不同的方法。
您的目標可能是某種初始化,通常發(fā)生在應用程序的頂層。
解決方案是確保應用程序的頂層僅存在一個JavaScript語句。如果您的應用程序頂部只有一條語句,那么您可以在其他任何地方隨意使用async / await(當然要遵循常規(guī)語法規(guī)則)
換句話說,將整個頂層包裝在一個函數(shù)中,使其不再是頂層,并且解決了如何在應用程序的頂層運行異步/等待的問題,而您卻沒有。
這是應用程序的頂層外觀:
import {application} from './server'
添加回答
舉報