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

时间:2017-01-13 15:54:53

标签: 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't care about result1, result2 in this `test` function
  return [result1, result2]
}

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

test().then(([result1, result2]) => { ... })

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

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

3 个答案:

答案 0 :(得分:1)

两个函数都返回Promise

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

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

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

更具可读性
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。当等待的承诺将解决时,函数内的执行继续,您可以访问承诺的结果

编辑1

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

答案 1 :(得分:1)

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

  def normalize
    rg = ReverseGeocoder.new(lat, lng, LOCALITY).process!
    return save_normalized_values(rg) if rg[:results].any?

    rg = ReverseGeocoder.new(lat, lng, ADMINISTRATIVE_AREA_LEVEL_1).process!
    return save_normalized_values(rg) if rg[:results].any?
  end

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

答案 2 :(得分:0)

我认为您在promise链中调用了一个同步函数(await将其转换为一个返回值的函数)。

来自answer

  

您可以完全自由地调用其中的同步功能   promise链(来自.then()处理程序)或异步函数   然后返回一个新的承诺。

     

当您从.then()处理程序返回某些内容时,您可以返回   要么是一个值(它成为父级的解析值)   承诺)或者你可以返回另一个承诺(链接到   先前的承诺)或者你可以抛出哪些像回归一样   被拒绝的承诺(承诺链被拒绝)。

第二种情况是您从test().then(...)调用同步方法,该方法有效。