Почему асинхронная функция возвращает ожидание уже выполненного обещания? - PullRequest
0 голосов
/ 28 февраля 2019

Действительно, такое поведение может вызвать некоторые проблемы с производительностью, т. Е. Дополнительные переключения контекста между «потоком» вызывающего абонента и «хвостом продолжения» асинхронной функции.

async function f(){
  await Promise.resolve("something");
  console.log("f: after await");
  return "somthing_else";
}

function g(){
  const fres = f();
  console.log("g: f returns");
  fres.then((x) => console.log("finish"));
}

g();

Вывод (по крайней мере, в моем Chrome):

g: f returns
f: after await
finish

Поскольку оператору ожидания фактически нечего ждать, я бы ожидал:

f: after await
g: f returns
finish

Это поведение определяется стандартом или зависит от реализации?

Если это стандартное поведение, в чем причина?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Обещания помещаются в очередь, которая выполняется после того, как текущая обычная очередь сценария пуста.

Таким образом, вы закончите выполнение g () и, следовательно, нажмите console.log("g: f returns"); в текущий стек перед f ()resolves.

Если журнал был внутри функции fres.then(), он будет зарегистрирован только после разрешения f().

0 голосов
/ 28 февраля 2019

f функция асинхронная, поэтому вы должны ждать ее в пределах g function

async function g(){
  const fres = await f();
  console.log("g: f returns");
  fres.then((x) => console.log("finish"));
}
...