2017-10-12 71 views
0

标题。我可以说,下面的两段代码是相等的:在JavaScript中未指定保证执行顺序吗?

await someFunc() // no assignment here 
doSomethingAfterSomeFunc() 

和:

someFunc().then(() => 
    doSomethingAfterSomeFunc() 
) 

我想,它看起来像他们是平等的,但有一个疑问(例如,某些优化)

+0

不,优化不能混淆语义。 – Bergi

回答

2

是的,它们完全一样,或多或少都是语法糖。 await导致执行暂停,直到等待解决的Promise

请参阅Javascript async有关重写承诺链以获取更多信息的部分。

+0

这个东西:这部分没有分配就错过了。但我相信你是对的 – kharandziuk

2

为了扩大Dan D's answer(因为花了我一段时间才弄明白我自己),我会再说一些关于执行流程的事情。事实上,使用await会阻止其调用的方法的流程,直到它解析为止。比方说,我们有这个异步函数:

const someFunc = (str) => { 
    return new Promise(resolve => { 
     setTimeout(() => { 
      console.log('resolving promise') 
      resolve() 
     }, 1500) 
    }) 
} 

因此,如果我们用的await称,像这样:

console.log('before calling') 
await someFunc() 
console.log('after calling') 

我们得到以下结果:

before calling 
resolving promise 
after calling 

然而,当我们使用.then()

console.log('before then') 
someFunc().then(() => console.log('resolved')) 
console.log('after then') 

发生这种情况:

before then 
after then 
resolving promise 
resolved 

这是因为.then()不停止执行流程和运行链下一个函数,只有当先前的承诺结束。有时你希望发生这种情况,有时候你不会,有时候这并不重要。但是如果你不了解这一点,可能需要一些时间才能搞清楚。所以我希望这个例子能帮助你理解它。