Кажется, я не могу понять, почему это не работает.
Потому что 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синтаксиса обещания .