Javascript:在异步函数中返回一个promise

BPm*_*BPm 13 javascript

如果我有以下情况会有什么不同:

async function test () {
  const foo = await bar()
  return Promise.all([promise1, promise2])
}
Run Code Online (Sandbox Code Playgroud)

代替:

async function test () {
  const foo = await bar()
  const [result1, result2] = await Promise.all([promise1, promise2])
  // Given that I don't care about result1, result2 in this `test` function
  return [result1, result2]
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我会得到相同的结果.例如,我可以为这两种情况做到这一点:

test().then(([result1, result2]) => { ... })
Run Code Online (Sandbox Code Playgroud)

但我对他们两者的行为方式的基本机制更加好奇.

换句话说,如果在函数内部我返回一个promise而不是一个值,async函数如何处理它?

Sco*_*ver 7

我认为您在await承诺链中有效地调用了类似同步的函数,根据这个答案

您可以完全自由地调用 Promise 链中的同步函数(从 .then() 处理程序中)或异步函数,然后返回一个新的 Promise。

当你从 .then() 处理程序返回一些东西时,你可以返回一个值(它成为父承诺的解析值)或者你可以返回另一个承诺(链接到前一个承诺)或者你可以抛出它的工作原理返回一个被拒绝的承诺(承诺链被拒绝)。


coc*_*ffs 7

我认为异步函数对于返回值的工作方式是检查该值是否包装在 Promise 对象中,如果没有,则自动执行。如果您显式返回 Promise,则该函数不会对其执行任何操作。我通过在异步函数中返回一个新的 Promise 来测试这一点:

async function test(){
var duration = resolveAfter(500)
    return new Promise((resolve, reject) =>{})
}

var neverresolved = test()
Run Code Online (Sandbox Code Playgroud)

结果 neverresolved 包含一个始终处于待处理状态的 Promise,如预期的那样。