【问题标题】:Variable is undefined after async IIFE异步 IIFE 后变量未定义
【发布时间】:2020-12-19 05:09:06
【问题描述】:
  let groupedWishlistProducts;

  (async function () {
      groupedWishlistProducts = await fetchGroupedWishlistProducts();
      console.log(groupedWishlistProducts); // logs returned value properly
  })();

  console.log(groupedWishlistProducts); // logs undefined

为什么groupedWishlistProducts 在全局范围内未定义,即使我已在全局范围内初始化?

【问题讨论】:

标签: javascript async-await iife


【解决方案1】:

它是未定义的,因为你还没有给它分配任何东西(还)。

事情的执行顺序是:

  1. 声明变量
  2. 声明并开始执行 IIFE
  3. 调用 fetchGroupWishlistProducts
  4. 已达到await,IIFE 现在返回到外部代码。
  5. 记录 groupedWishlistProducts(函数外)
  6. 一段时间后,来自 fetchGroupedWishlistProducts 的承诺解决,异步功能恢复
  7. 将 fetchGroupedWishlistProduct 的 promise 的结果分配给 groupedWishlistProducts
  8. 记录 groupedWishlistsProducts(函数内部)

【讨论】:

  • #4 应该是 "由于异步,IIFE 现在返回一个承诺"
  • 我描述的是事情发生的顺序,所以#4 描述的是它返回的whenawait 关键字是导致它在那个时间返回的原因,而不是另一个时间。我已经改写它以强调时间,而不是价值。
【解决方案2】:

async function 返回Promise,所以当你执行 IIFE 时,Promise 仍然处于等待状态,因为结果 fetchGroupedWishlistProducts() 不会被解析。所以在你的情况下,第二个console.log将首先被执行,并且是undefined

要处理这个问题,您可以将其包装到另一个 IIFE 中

let groupedWishlistProducts;

(async function() {
  
  await (async function () {
    groupedWishlistProducts = await fetchGroupedWishlistProducts();
    console.log(groupedWishlistProducts); // logs returned value properly
  })();

  console.log(groupedWishlistProducts);

})()

或者只是解决承诺

let groupedWishlistProducts;

(async function () {
  groupedWishlistProducts = await fetchGroupedWishlistProducts();
  console.log(groupedWishlistProducts); // logs returned value properly
})().then(() => {
  console.log(groupedWishlistProducts);
})

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多