避免异步/等待地狱

2025-05-25

避免异步/等待地狱

Anders Drange 图片

逃离异步/等待地狱或避免链式异步任务

首先,我们来谈谈 async/await 地狱,然后看看如何避免它

TL;DR

这就是我们正在谈论的 async/await 地狱,它只是一个例子,还有更多。

const user = await getUser(id);
const items = await getItems();
return {
  user,
  items,
};
Enter fullscreen mode Exit fullscreen mode

这里我们先获取特定用户的详细信息,然后再获取商品列表。你可能会说,这有什么问题?问题是,我们在获取商品列表之前要等待获取用户详细信息,尽管获取商品列表并不依赖于用户列表。所以,如果我们可以并行运行它们,为什么还要等待呢?此外,这还会降低性能。

现在,考虑这个例子:

  (async () => {
    const user = await getUser(id);
    const items = await getItems();
    return {
      user
       items
    }
  })()
Enter fullscreen mode Exit fullscreen mode

我们用IIFE包装了它,但这段代码仍然是逐行执行的

那么我们可以做些什么来避免这种情况呢?

我们有解决方案:

我们可以使用类似的东西来修复它

在这种情况下,用户和项目返回一个承诺,因此可以在返回值时等待承诺履行

const user = userPromise(id);
const items = itemsPromise();
return {
  user: await whenUser,
  items: await whenItems,
};
Enter fullscreen mode Exit fullscreen mode

但我更喜欢使用 Promise.all,它更简洁

const [user, items] = await Promise.all([getUser(id), getItems()]);
return { user, items };
Enter fullscreen mode Exit fullscreen mode

简单、优雅😄并且速度提高了两倍,因为 Promise.all 同时执行所有操作。

您可以在 MDN 上了解有关Promise.all的更多信息

注意:值得注意的是,Promise.all 将在所有 Promise 成功或第一个 Promise 被拒绝时返回,而 Promise.allSettled 将等到所有 Promise 都已解决或被拒绝

文章来源:https://dev.to/judionit/avoid-asyncawait-hell-2gb6
PREV
撰写技术文章获得报酬
NEXT
我在 Amazon Web Services 上被扣了 14,000 美元