3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
我似乎無(wú)法繞開(kāi)為什么這行不通的想法。
因?yàn)閙ain回報(bào)承諾;所有async功能都可以。
在頂層,您必須:
使用async永不拒絕的頂層函數(shù)(除非您希望出現(xiàn)“未處理的拒絕”錯(cuò)誤),或者
使用then和catch,或
(即將推出?。┦褂庙攲觓wait,該提案已進(jìn)入允許在模塊中頂層使用的過(guò)程中的第3階段await。
#1- async永不拒絕的頂級(jí)功能
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
注意catch; 您必須處理Promise拒絕/異步異常,因?yàn)闆](méi)有其他事情要做;您沒(méi)有呼叫者將其傳遞給。如果愿意,可以在通過(guò)catch函數(shù)(而不是try/ catch語(yǔ)法)調(diào)用它的結(jié)果上執(zhí)行此操作:
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
...更加簡(jiǎn)潔(出于這個(gè)原因,我喜歡它)。
或者,當(dāng)然,不處理錯(cuò)誤,而只允許“未處理的拒絕”錯(cuò)誤。
#2- then和catch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
catch如果鏈或您的then處理程序中發(fā)生錯(cuò)誤,則將調(diào)用該處理程序。(請(qǐng)確保您的catch處理程序不會(huì)拋出錯(cuò)誤,因?yàn)闆](méi)有任何內(nèi)容可以處理。)
或兩個(gè)參數(shù)then:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
再次注意,我們正在注冊(cè)一個(gè)拒絕處理程序。但是,以這種形式,請(qǐng)確保您的then回調(diào)都不會(huì)引發(fā)任何錯(cuò)誤,也沒(méi)有任何內(nèi)容可以處理。
#3頂級(jí)await模塊
您不能await在非模塊腳本的頂層使用await,但是頂層建議(第3階段)允許您在模塊的頂層使用它。這與使用頂級(jí)async函數(shù)包裝器(上面的#1)相似,因?yàn)槟幌M捻敿?jí)代碼拒絕(拋出錯(cuò)誤),因?yàn)檫@將導(dǎo)致未處理的拒絕錯(cuò)誤。因此,除非您要在出現(xiàn)問(wèn)題時(shí)遇到未處理的拒絕,例如#1,否則您需要將代碼包裝在錯(cuò)誤處理程序中:
// 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貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
解決此問(wèn)題的實(shí)際方法是采用不同的方法。
您的目標(biāo)可能是某種初始化,通常發(fā)生在應(yīng)用程序的頂層。
解決方案是確保應(yīng)用程序的頂層僅存在一個(gè)JavaScript語(yǔ)句。如果您的應(yīng)用程序頂部只有一條語(yǔ)句,那么您可以在其他任何地方隨意使用async / await(當(dāng)然要遵循常規(guī)語(yǔ)法規(guī)則)
換句話說(shuō),將整個(gè)頂層包裝在一個(gè)函數(shù)中,使其不再是頂層,并且解決了如何在應(yīng)用程序的頂層運(yùn)行異步/等待的問(wèn)題,而您卻沒(méi)有。
這是應(yīng)用程序的頂層外觀:
import {application} from './server'
添加回答
舉報(bào)