一个人可以await
非承诺,that's good so。
所有这些表达式都是有效的,并且不会导致错误:
await 5
await 'A'
await {}
await null
await undefined
等待无承诺有可检测的效果吗?为了避免潜在的错误,应该注意哪些行为上的差异?有任何性能差异吗?
以下两行是完全相同的,还是在理论上是不同的?:
var x = 5
var x = await 5
如何?有什么例子可以证明区别吗?
PS:根据TypeScript authors,有一个区别:
var x = await 5;
与var x = 5;
不同;var x = await 5;
将在下一个tern中分配x 5,其中var x = 5;
将立即求值。
答案 0 :(得分:5)
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
在等待的事物上存在,就会被调用。
为了避免潜在的错误,应该注意哪些行为上的差异?
如果您不希望将其命名为Promise,请不要将其命名为“ then”。
任何性能差异?
当然,如果您等待事情,您将始终推迟继续执行微任务。但还是一如既往:您可能不会注意到它(作为观察结果的人类)。
答案 1 :(得分:1)
完全同意乔纳斯的说法。在他的问题中没有得到回答的一件事是以下两行是完全相同的还是理论上不同??
以下两行并不完全相同,理论上是不同的。
event-loop
中执行等待的承诺。第1行将在到达stack
之后立即执行,但第2行将花费一些时间(毫秒),因为它会首先跳过stack
,然后跳过webAPI等待到达task queue
部分,因为没有希望解决的问题,最后,该控制权将再次交给stack
以便执行。