是否可以在不分配JavaScript的情况下保证执行顺序?

kha*_*iuk 8 javascript node.js async-await

学科。我可以说下面的两段代码相等吗:

await someFunc() // no assignment here
doSomethingAfterSomeFunc()
Run Code Online (Sandbox Code Playgroud)

和:

someFunc().then(() => 
  doSomethingAfterSomeFunc()
)
Run Code Online (Sandbox Code Playgroud)

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

小智 7

为了扩展Dan D的答案(因为我花了一段时间才弄清楚自己),我将讲一些关于执行流程的更多信息。确实,using await阻止了方法的流程,直到解决为止。假设我们有这个异步功能:

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

因此,如果我们用await进行呼叫,如下所示:

console.log('before calling')
await someFunc()
console.log('after calling')
Run Code Online (Sandbox Code Playgroud)

我们得到以下结果:

before calling
resolving promise
after calling
Run Code Online (Sandbox Code Playgroud)

但是,当我们使用时.then():

console.log('before then')
someFunc().then(() => console.log('resolved'))
console.log('after then')
Run Code Online (Sandbox Code Playgroud)

有时候是这样的:

before then
after then
resolving promise
resolved
Run Code Online (Sandbox Code Playgroud)

这是因为.then()仅当前一个诺言完成时,才停止执行流程并在链中运行下一个函数。有时您希望这种情况发生,有时您不希望发生,有时并不重要。但是,如果您对此一无所知,可能需要一些时间才能解决。因此,我希望这个例子可以帮助您理解它。


Dan*_*n D 6

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

有关更多信息,请参见Javascript async一节中的重写诺言链。