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