一个人可以做一个非承诺者和一个非承诺者。
所有这些表达式都是有效的,不会导致错误:
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;
将立即求值。
3条答案
按热度按时间balp4ylt1#
await
不是no-op。如果等待的东西不是一个承诺,它就被 Package 在一个承诺中,并且等待这个承诺。因此await
改变了执行顺序(但是您仍然不应该依赖它):以下输出1、2、3:
去掉
await
后,它是1、3、2:此外,
await
不仅适用于instanceof Promise
s,还适用于每个使用.then
方法的对象:等待一个非承诺是否有任何可察觉的影响?
当然,如果
.then
存在于等待的东西上,它就会被调用。为了避免潜在的错误,人们应该注意的行为是否有任何不同?
如果你不想让一个方法成为一个承诺,就不要将它命名为“then”。
是否存在性能差异?
当然,如果你在等待,你总是会把后续任务推迟到微任务上,但和往常一样:你可能不会注意到它(作为一个人观察结果)。
1bqhqjot2#
完全同意乔纳斯的陈述。他的问题中有一点没有回答,那就是下面两行是完全相同的还是理论上不同的?:
这两条线并不完全相同,它们在理论上是不同的。
1.变量x = 5
1.变量x =等待5
在我控制台中第一条和第二条语句的执行时间分别是0.008056640625ms和0.055908203125ms。**异步/等待,setTimeOut等是运行时提供的API,JavaScript运行时在其中运行。**将等待置于非承诺将在
event-loop
中执行。第1行将在到达stack
后立即执行,但第2行将花费很少的时间(毫秒),因为它将首先转到stack
,然后在跳过webAPI等待部分后转到task queue
,因为没有解决的承诺&最后,在此之后,控制将再次被给予stack
以用于执行。g2ieeal73#
如果等待的东西没有
then
属性,那么等待的代码就会被 Package 在一个承诺中。因此,尽管在性能上存在差异(需要更长的时间),但是在 * 行为 * 上没有 * 可观察到的 * 差异,除非您等待的东西有then
属性--在这种情况下,如果等待的东西实际上不是一个将要完成的承诺,那么行为可能是不可预测的。