如果我有:
会有什么不同吗?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>
答案 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(...)
调用同步方法,该方法有效。