javascript - 使用 Javascript 数组索引了解 await
问题描述
我在 Javascript 代码中遇到了一个问题,其中await
与数组索引返回值结合使用的行为与我预期的不同。
我有一个异步函数返回一个数组,类似于这个例子:
const myFn = async () => {
let result = [];
for(i=0; i<100; i++) {
result.push(i);
}
return result;
};
const a = await myFn()[0]; // -> undefined
const result = await myFn();
const b = result[0]; // -> 0
在这里我看到a
是undefined
, whileb
是 0。我期望两者a
都b
被分配 0。然后我还发现数组索引上的 await 是有效的语法,这解释了为什么如果只使用 await 语句,上面的两个值是不同的目标是最高级别的操作。
const myArr = [ 'a', 'b', 'c' ];
const a = await myArr[0];
所以我的问题是,当您等待数组索引时实际发生了什么,为什么这是有效的语法?
解决方案
await
的运算符优先级为 17。相比之下,成员访问(例如[0]
)的优先级更高,为 20。
所以
await myFn()[0];
相当于
await (myFn()[0]);
这是有效的语法,因为可以await
编辑任何表达式(对于非 Promise 这样做没有多大意义)。
(async () => {
const contains5 = await 5;
console.log(contains5);
})();
await myFn()[0];
访问[0]
由 - 返回的 Promise 的第 th 属性,myFn
但 Promise 没有这样的属性,因此undefined
.
不使用单独的行来实现您想要的另一种方法是将myFn
Promise 与括号分组(括号分组覆盖所有其他优先级):
const a = (await myFn())[0];
您还可以在左侧进行解构:
const [a] = await myFn();
推荐阅读
- google-apps-script - 使用 onChange 触发器的详细信息
- reactjs - Firebase如何重新使用对`ReferenceCompat`类型的firebase存储的引用?
- node.js - MongooseServerSelectionError ECONNREFUSED 与 docker-compose 一起使用 mongo 容器
- node.js - Elasticsearch - 查找所有具有嵌套 id 的实体
- python - 如何从函数生成函数
- java - 尝试在 Java 中解析 XML 响应的协议错误
- java - 在调整大小的按钮上缩放图像
- python - 无法理解调用和返回的内容
- spring-boot - Chrome 为 manifest.json 提供 401 错误
- python - 从元组列表中删除特定索引