Имеет ли ожидание не-Promise какой-либо заметный эффект?

Можно await не-Promise и это хорошо.

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

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; назначит x 5 в следующем терме, тогда как var x = 5; оценит немедленно.


person ttulka    schedule 20.03.2019    source источник


Ответы (2)


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 вызывается, если он существует в ожидаемой вещи.

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

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

Любые различия в производительности?

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

person Jonas Wilms    schedule 20.03.2019
comment
Что вы имеете в виду под no a no op ? вы имеете в виду not a no-op правильно? - person Kunal Mukherjee; 20.03.2019
comment
@kunal да, я печатаю быстрее, чем реагирует моя клавиатура, что приводит к некоторым забавным опечаткам :) - person Jonas Wilms; 20.03.2019
comment
но тем не менее полагаться на это не стоит Почему бы и нет? - person a better oliver; 24.04.2019
comment
Пример @aBetterOliver: вы запускаете два очень коротких действия и хотите работать с их результатом. Вы знаете, что действие 1 завершается раньше, чем действие 2, поэтому вы сохраняете результат 1 в переменной и обращаетесь к нему, когда выполняется 2. Теперь кто-то когда-нибудь меняет алгоритм, чтобы 1 работал медленнее, чем 2. Ваш код ломается, и никто не знает, почему. Если вам нужно выполнять асинхронные задачи в определенном порядке, вы должны явно указать это. - person Jonas Wilms; 24.04.2019

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

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

  1. переменная х = 5
  2. вар х = ждать 5

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

person fahad tufail    schedule 21.03.2019
comment
Я думаю, что на этот вопрос уже был дан ответ в примере фрагмента кода. Все равно спасибо! - person ttulka; 21.03.2019
comment
на самом деле последняя часть вопроса отсутствовала, т.е. Являются ли следующие две строки полностью одинаковыми или они теоретически различаются?. - person fahad tufail; 21.03.2019
comment
Пример кода от @JonasWilms очень четко показал разницу... - person ttulka; 21.03.2019
comment
Отлично. Тогда предположим другое объяснение :) - person fahad tufail; 21.03.2019