JavaScript ожидает по умолчанию вместо
Async/await действительно удобны, но я хочу, чтобы противоположность их поведения. Вместо продолжения других функций, если я вручную не попрошу их ждать обещания, я хочу, чтобы функции выполнялись, если я вручную не укажу, что они продолжают работать параллельно.
Например, этот код напечатает 1 3 2
:
function wait(ms) {
return new Promise(r => setTimeout(r, ms));
}
async function a() {
console.log("1");
await wait(5000);
console.log("2");
}
a();
console.log("3");
Я хочу, чтобы он распечатывал 1 2 3
, функция a()
фактически не возвращалась, пока я не ждал 5 секунд и 2 был напечатан. Я делаю расширение, которое я предпочитаю быть легким, поэтому я бы предпочел не использовать сторонние библиотеки.
Есть ли способ сделать это?
Ответы
Ответ 1
Неявное ожидание плохое, по причинам, хорошо освещенным в в этом блоге. Короче говоря, подумайте, почему нет необходимости блокировать JavaScript. Это потому, что мы не беспокоимся о том, чтобы быть упреждающим волей-неволей.
Кроме того, как упоминалось в комментариях Daniel, глобальный await
также не допускается, по-видимому, для обратной совместимости.
Вы можете обойти это, обернув код верхнего уровня следующим образом:
let wait = ms => new Promise(r => setTimeout(r, ms));
async function a() {
console.log("1");
await wait(5000);
console.log("2");
}
(async () => {
// Put your top level code here!
await a();
console.log("3");
})().catch(e => setTimeout(() => { throw e; }));