是否等待保证执行顺序而不在JavaScript中进行赋值?

时间:2017-10-12 14:22:32

标签: javascript node.js async-await

主题。我可以说下面的两段代码是相同的:

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

要扩展Dan D's answer(因为我花了一些时间来弄清楚自己),我会说一些关于执行流程的事情。实际上,使用await会阻止调用它的方法流,直到它结算为止。假设我们有这个异步函数:

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

所以如果我们等待,就像这样:

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()不会停止执行流程,只有在前一个承诺完成后才会在链中运行下一个函数。有时候你希望这种情况发生,有时你却不这样做,有时它并不重要。但如果您不了解这一点,可能需要一些时间来弄明白。所以我希望这个例子可以帮助你理解它。