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就没有用了