javascript - 异步调用具有多个返回的函数
问题描述
我正在处理的异步函数返回数组中的多个值
const funcName = async function (arg) {
...
return [val1, val2];
}
在调用此函数时,我发现无法直接访问语法中的单个返回值:
result1 = await funcName(arg)[0]
result2 = await funcName(arg)[1]
它起作用的唯一方法(到目前为止我知道)是将其分解:
result = await funcName(arg)
result1 = result[0]
result2 = result[1]
有没有办法直接在一个 LOC 中“收集”退货?
(非常接近,就像r1 = await fn(x)[0]
)
这显然适用于同步变体,并保持代码非常精确、干净、可读。
奖金问题:任何线索为什么不支持直接数组访问?
有意为之,还是只是错过了?
解决方案
运算符的语法await
是
await UnaryExpression
这意味着整个表达式将在移交给await
. 以下是您遇到的情况的细分await funcName(arg)[0]
funcName(arg)
返回一个承诺。[0]
是承诺中使用的方括号符号。因此,它0
从 promise 对象中获取属性。由于没有这样的属性,表达式的结果是
undefined
。await
被调用undefined
。由于这不是一个承诺,它被视为 aPromise.resolve(undefined)
,因此无需等待完成。在步骤1.中的实际承诺对象完成之前,代码继续执行。
如果您将表达式的正确部分括在括号中,或者仅在返回 promise 的表达式上使用它,您可以强制await
考虑返回的 promise:
const simpleAsync = async function () {
return ["one", "two"];
}
async function main() {
const foo = await simpleAsync()[0];
const bar = (await simpleAsync())[0];
// ^ ^
const baz = await simpleAsync();
console.log("foo:", foo);
console.log("bar:", bar);
console.log("baz:", baz);
}
main();
但是,如果您想直接获取两个返回值,您可以简单地使用解构进行多重赋值:
const simpleAsync = async function () {
return ["one", "two"];
}
async function main() {
const [a, b] = await simpleAsync();
console.log("a:", a);
console.log("b:", b);
}
main();
这种方式await
是用一个实际的承诺调用的,而不是一个非承诺,在解决之后,a
andb
变量将被分配。
推荐阅读
- c# - 分组并添加对象 C# 的项目列表
- angular - 如何在 Angular 中使用带有可观察对象 RXJS 的条件和循环来改进我的流代码?
- python - Conda dlip:使用 conda 在 Windows 10 上安装期间出现 UnsatisfiableError
- amazon-web-services - 在 aws-Route53 中显示没有可用于将域与我的 ip 链接的目标
- javascript - 如何使用函数动态分配 d3.forceRadial 的中心?
- node.js - 如何将一个函数结果传递给 Node.js 中的另一个函数
- laravel-5 - 如何修改 vendor/ 目录下的代码
- swift - CompletionHandler 和闭包
- mongodb - $group by 8 记录聚合
- html - 如何垂直固定导航箭头?