【发布时间】:2021-03-12 17:02:37
【问题描述】:
我有一个从数据库中获取的对象数组。
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> },也就是说,所有的承诺都嵌套在数组的每个用户对象中。而且我不知道如何处理它。如何遍历所有用户对象并解决他们内部的这个承诺?
选项 2:返回要在 Promise.all 中解决的承诺
const dependencies = Promise.all(users.map((user) => {
return user.getDependency();
}));
这给了我一个包含我想要的所有依赖项的单独数组,但就是这样,分开了。我得到一个包含对象用户的数组和另一个包含对象依赖项的数组。
特别困扰我的是,我认为必须有一种简单直接的方法来做到这一点,而我错过了。有人有想法吗?非常感谢
【问题讨论】:
-
你控制
user.getDependency()的代码吗?如果是这样,则让该方法负责将异步结果缓存为用户的道具。那么,您的选项 2 代码就可以了;当 promise.all() 解析时,每个用户都将初始化其依赖项。 -
很遗憾不是,这是一种sequelize方法。但感谢您的意见!
标签: javascript arrays object asynchronous promise