Проблема в том, что поскольку операция, предоставляющая значение, является асинхронной, другие функции в вашем модуле могут попытаться использовать переменную / константу до того, как ее значение будет установлено.Так что лучше избегать этого, возможно, делая то, что предлагает Джесси Халлетт , и заставляя другие функции в модуле использовать обещание.
Если вы не можете этого избежать,и вы точно знаете, что эти функции не будут вызваны до того, как асинхронная операция вернет значение, используйте опцию let
, инициализирующую переменную с null
или некоторым другим значением флага, и проверьте это значение флага в функциях, которыеякобы не звонят, пока он не будет готов и их бросят.Например:
let myConst = null; // null or some other value that isn't valid for this
(async () => {
try {
myConst = await asyncFunction(params);
} catch (e) {
// Handle the fact the async function failed -- don't skip this!
}
})();
function assumeMyConst() {
if (myConst === null) {
throw new Error("State error: myConst not available yet");
}
}
function foo() {
assumeMyConst();
// ...
}
Но опять же, если возможно, избегайте этого.
Примечание: обратите внимание на проверку ошибок в этом async
IIFE.Не пропускайте проверку ошибок.: -)