Кажется, я не могу понять, почему это не работает.
Потому что main
возвращает обещание; все async
функции делают.
На верхнем уровне вы должны либо:
Используйте функцию верхнего уровня, async
которая никогда не отклоняет (если вы не хотите ошибок «необработанного отклонения»), или
Используйте then
и catch
, или
(Скоро!) Используйте верхнего уровняawait
, предложение, достигшее стадии 3 в процессе, который позволяет использование верхнего уровня await
в модуле.
# 1 - async
функция верхнего уровня, которая никогда не отклоняет
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Обратите внимание на catch
; вы должны обрабатывать обещания отклонения / асинхронные исключения, так как больше ничего не происходит; у вас нет звонящего, чтобы передать их. Если вы предпочитаете, вы можете сделать это в результате вызова через catch
функцию (вместо try
/ catch
синтаксис):
(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
обработчике. (Убедитесь, что ваш catch
обработчик не генерирует ошибки, так как ничего не зарегистрировано для их обработки.)
Или оба аргумента then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Снова обратите внимание, что мы регистрируем обработчик отклонения. Но в этой форме, будьте уверены, что ни один из ваших then
обратных вызовов не выдает никаких ошибок, ничего не зарегистрировано для их обработки.
# 3 верхнего уровня await
в модуле
Вы не можете использовать await
на верхнем уровне скрипта без модуля, но на высшем уровне await
предложение ( этап 3 ) позволяет использовать его на верхнем уровне модуля. Это похоже на использование async
оболочки функций верхнего уровня (# 1 выше) в том смысле, что вы не хотите, чтобы ваш код верхнего уровня отклонял (выдавал ошибку), потому что это приведет к необработанной ошибке отклонения. Поэтому, если вы не хотите иметь необработанное отклонение, когда что-то пойдет не так, как в случае с # 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
}
Обратите внимание, что если вы сделаете это, любой модуль, который импортирует из вашего модуля, будет ждать, пока не выполнится обещание await
; когда модуль, использующий верхний уровень await
, оценивается, он в основном возвращает обещание загрузчику модулей (как это async
делает функция), которое ждет, пока это обещание не будет выполнено, прежде чем оценивать тела любых модулей, которые зависят от него.
await
ничего, кроме сахара дляthen
синтаксиса обещания .