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; }));