避免异步/等待地狱
逃离异步/等待地狱或避免链式异步任务
首先,我们来谈谈 async/await 地狱,然后看看如何避免它
TL;DR
这就是我们正在谈论的 async/await 地狱,它只是一个例子,还有更多。
const user = await getUser(id);
const items = await getItems();
return {
user,
items,
};
这里我们先获取特定用户的详细信息,然后再获取商品列表。你可能会说,这有什么问题?问题是,我们在获取商品列表之前要等待获取用户详细信息,尽管获取商品列表并不依赖于用户列表。所以,如果我们可以并行运行它们,为什么还要等待呢?此外,这还会降低性能。
现在,考虑这个例子:
(async () => {
const user = await getUser(id);
const items = await getItems();
return {
user
items
}
})()
我们用IIFE包装了它,但这段代码仍然是逐行执行的
那么我们可以做些什么来避免这种情况呢?
我们有解决方案:
我们可以使用类似的东西来修复它
在这种情况下,用户和项目返回一个承诺,因此可以在返回值时等待承诺履行
const user = userPromise(id);
const items = itemsPromise();
return {
user: await whenUser,
items: await whenItems,
};
但我更喜欢使用 Promise.all,它更简洁
const [user, items] = await Promise.all([getUser(id), getItems()]);
return { user, items };
简单、优雅😄并且速度提高了两倍,因为 Promise.all 同时执行所有操作。
您可以在 MDN 上了解有关Promise.all的更多信息
文章来源:https://dev.to/judionit/avoid-asyncawait-hell-2gb6注意:值得注意的是,Promise.all 将在所有 Promise 成功或第一个 Promise 被拒绝时返回,而 Promise.allSettled 将等到所有 Promise 都已解决或被拒绝