Ожидает ли не-Обещание какой-либо заметный эффект? - PullRequest
4 голосов
/ 20 марта 2019

Можно await не-Обещание и , что хорошо, поэтому .

Все эти выражения верны и не вызывают ошибок:

await 5
await 'A'
await {}
await null
await undefined 

Есть ликакой-нибудь обнаружимый эффект ожидания не-обещания?Есть ли разница в поведении, о котором следует знать, чтобы избежать потенциальной ошибки?Есть ли различия в производительности?

Следующие две строки полностью одинаковы или они теоретически отличаются?

var x = 5
var x = await 5

Как?Любой пример, чтобы продемонстрировать разницу?

PS: По словам авторов TypeScript , есть разница:

var x = await 5; не совпадает с var x = 5;;var x = await 5; назначит х 5 в следующей крачке, где var x = 5; оценит сразу.

Ответы [ 2 ]

5 голосов
/ 20 марта 2019

await не является запретом.Если ожидаемая вещь не является обещанием, она завернута в обещание, это обещание ожидается.Поэтому await меняет порядок выполнения (но вы все равно не должны на него полагаться):

console.log(1);
(async function() {
  var x = await 5; // remove await to see 1,3,2
  console.log(3);
})();
console.log(2);

Кроме того await работает не только на instanceof Promise с, но и на каждом объекте с .thenМетод:

await { then(cb) { /* nowhere */ } };
console.log("will never happen");

Есть ли какой-нибудь заметный эффект ожидания не-Обещания?

Конечно, .then вызывается, если он существует на ожидаемой вещи.

Есть ли какое-либо различие в поведении, о котором следует знать, чтобы избежать потенциальной ошибки?

Не называйте метод «тогда», если не хотите, чтобы он был обещанием.

Есть ли различия в производительности?

Конечно, если вы ждете чего-то, вы всегда откладываете продолжение на микрозадачу.Но как всегда: вы, вероятно, не заметите этого (как человек, наблюдающий за результатом).

1 голос
/ 21 марта 2019

Полностью согласен с заявлениями Джонаса. Одна вещь, на которую не был дан ответ в его вопросе, была Являются ли следующие две строки полностью одинаковыми или они теоретически отличаются?

следующие две строки не полностью одинаковы, они теоретически различны.

  1. var x = 5
  2. var x = await 5

время выполнения в моей консоли для 1-го и 2-го оператора составляет 0,008056640625мс и 0,055908203125мс соответственно. async / await, setTimeOut и т. Д. - это API, предоставляемые средой выполнения, в которой выполняется среда выполнения JavaScript. Задержка ожидания без обещания будет выполнена в event-loop. Строка 1 будет выполнена сразу после достижения stack, но строка 2 займет несколько времени (миллисекунды), поскольку 1-ый переходит к stack и затем к task queue после пропуска секции ожидания webAPI, потому что нет обещания и, наконец, после этого управление снова будет передано stack для выполнения.

...