繁体   English   中英

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

[英]Javascript: Return a promise inside async function

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

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]) => { ... })

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

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

我想你有效调用同步相似的功能与await的承诺链中,而根据这个答案

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

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

我认为异步函数在返回值方面的工作方式是检查该值是否包含在Promise对象中,如果不包含,则自动执行。 如果你明确地返回一个Promise,那么该函数对它没有任何作用。 我通过在异步函数中返回一个新的Promise来测试它:

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

var neverresolved = test()

从未解决的结果包含一个始终处于挂起状态的Promise,正如预期的那样。

这两个函数都返回一个Promise

const [result1, result2] = await Promise.all([promise1, promise2])
//HERE
return [result1, result2]

我在这里写的你可以访问作为promises结果的result1和result2 var。

等待是调用备选thenPromise和它的形式也比更具有可读性

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

});

如果你有多个顺序请求使用await是一个更好的选择

var response1= await promise1   
var response2=await promise2

反对

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

编辑

在第一个函数中,关键字async是无用的,函数test将返回一个Promise

第二个函数将返回一个Promise,您可以在其中看到关键字await。 当等待的promise将解决函数内部的执行继续时,您可以访问promise的结果

编辑1

也许我理解你的意思,async关键字将你的返回值封装到一个promise中,该promise具有已经返回的已解析值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM