Я, здається, не можу обернути голову, чому це не працює.
Тому що 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синтаксису обіцянок .