我有一个从数据库中获取的对象数组。
const users = await User.findAll();
对于他们每个人,我想调用一个异步函数user.getDependency()
来获取另一个相关表,并将嵌套在对象中的表分解为最终格式,如下所示:
[
User {
attr1: value,
attr2: value,
...
Dependency: {
attr1: value,
...
}
},
User {
...
等等
现在,我明白了。我能够想到的涉及异步和循环的唯一可能性是2:
选项1:映射它们并重新获得承诺:
users.forEach((user) => {
user.dependency= user.getDependency();
});
有了这个,我就在格式上得到了想要的结果,只是我得到的显然不是解决的东西Dependency: Promise { <pending> }
,也就是说,promise全部嵌套在数组的每个用户对象中。而且我不知道该如何进行。如何遍历所有用户对象并解决它们在内部的承诺?
选项2:返回Promise.all中要解决的承诺
const dependencies = Promise.all(users.map((user) => {
return user.getDependency();
}));
这给了我一个分离的数组,其中包含了我想要的所有依赖关系,仅此而已。我得到一个包含对象用户的数组,另一个包含对象依赖项。
让我特别烦恼的是,我认为必须有一种简单直接的方法来完成它,而我却很想念。有人有主意吗?非常感谢
为了建立直觉,这是您的forEach示例,向正确方向按一下即可转换。
users.forEach((user) => {
user.getDependency().then(dependency => {
user.dependency = dependency
})
})
上面的内容是“对于每个用户,从获取依赖项开始,然后在解决后将依赖项添加到用户中”。我不认为上面的方法很有用,因为一旦所有依赖项都已完成提取,您可能希望对用户执行某些操作。在这种情况下,您可以Promise.all
沿侧面使用.map
const usersWithResolvedDependencies = await Promise.all(
users.map(user => user.getDependency().then(dependency => {
user.dependency = dependency
return user
}))
)
// do stuff with users
我应该提一下,我写了一个简化异步的库,当然也可以简化这个问题。以下等同于以上内容。map
并且assign
是从我的图书馆,rubico
const usersWithResolvedDependencies = map(assign({
dependency: user => user.getDependency()
}))(users)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句