Javascript:在异步函数中返回承诺

Javascript:在异步函数中返回承诺,javascript,Javascript,如果我有: async function test () { const foo = await bar() return Promise.all([promise1, promise2]) } 而不是: async function test () { const foo = await bar() const [result1, result2] = await Promise.all([promise1, promise2]) // Given that I don'

如果我有:

async function test () {
  const foo = await bar()
  return Promise.all([promise1, promise2])
}
而不是:

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]
}
如果我做任何一个,我都会得到同样的结果。例如,我可以在任何一种情况下这样做:

test().then(([result1, result2]) => { ... })
但我更好奇的是,它们是如何表现出相同行为的潜在机制


换句话说,如果在函数中我返回一个承诺而不是一个值,异步函数如何处理它?

两个函数都返回一个
承诺

const [result1, result2] = await Promise.all([promise1, promise2])
//HERE
return [result1, result2]
我在这里写道,您可以访问result1和result2 var,它们是承诺的结果

wait是在
Promise
上调用
then
的替代方法,其形式也比

Promise.all([promise1, promise2]).then(function(results){

});
如果您有多个顺序请求,那么使用wait是更好的选择

var response1= await promise1   
var response2=await promise2
反对

promise1.then(function(){
    promise2.then(function(){
       promise3.then(function(){
       })
    })
})
编辑

在第一个函数中,关键字async是无用的,函数测试将返回一个承诺

第二个函数将返回一个Promise,在这里您可以看到关键字wait。当等待的承诺得到解决时,函数内部的执行将继续,您可以访问承诺的结果

编辑1


也许我理解你的意思,async关键字将返回值封装成一个承诺,该承诺将返回的值作为解析值

我认为你在承诺链中使用
wait
有效地调用了类似同步的函数,根据这一点:

您完全可以在 承诺链(从.then()处理程序中)或异步函数 然后,你会得到一个新的承诺

当您从.then()处理程序返回某些内容时,您可以返回 一个值(成为父级的解析值) 承诺)或者您可以返回另一个承诺(该承诺将链接到 之前的承诺)或者您可以抛出类似于返回 拒绝承诺(承诺链被拒绝)


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

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

var neverresolved = test()

结果是neverresolved包含始终处于挂起状态的承诺,正如预期的那样。

是的,我理解这一点。但是,如果说async总是返回一个承诺,这意味着它将把返回的承诺封装在另一个承诺?承诺。所有创建的新承诺与返回的承诺相同,Wait将只是暂停函数的执行,直到承诺中的值可用。我想你误解了我的问题。我知道Promise.all以及如何使用异步函数。我的问题更像是:对于第一种情况,我返回一个异步函数将解析为的值。至于第二种情况,到底发生了什么?不是我想问的。它看起来没用,因为我给出了一个简单的例子,如果在两者之间,我需要执行一个
等待
?那么
async
就没有用了。如果不在内部使用wait,async就没有用了