首页 > 解决方案 > 使用 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

在这里我看到aundefined, whileb是 0。我期望两者ab被分配 0。然后我还发现数组索引上的 await 是有效的语法,这解释了为什么如果只使用 await 语句,上面的两个值是不同的目标是最高级别的操作。

const myArr = [ 'a', 'b', 'c' ];

const a = await myArr[0];

所以我的问题是,当您等待数组索引时实际发生了什么,为什么这是有效的语法?

标签: javascriptnode.jsasync-await

解决方案


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.

不使用单独的行来实现您想要的另一种方法是将myFnPromise 与括号分组(括号分组覆盖所有其他优先级):

const a = (await myFn())[0];

您还可以在左侧进行解构:

const [a] = await myFn();

推荐阅读