javascript - 从包含承诺的对象数组中获取数据
问题描述
在我的反应应用程序中,我有一些用户 ID,需要从不同的端点获取他们的电子邮件和姓名,所以我要做的是:
const promises = ids.map(
id => ( {email: axios.get(`blabla/${id}/email`), name: axios.get(`blabla/${id}/name`)} )
);
它让我回来了:
[
{email: Promise, name: Promise},{email: Promise, name: Promise},{email: Promise, name: Promise},...
]
现在要获取数据,我要做的是:
const results = [];
promises.map(({ email, name}) =>
Promise.all([email, name]).then((result) => {
results.push({
email: result[0].data,
name: result[1].data,
});
})
);
但我有一种感觉,这可能不是一个好方法,我的意思是它现在可以工作,但我不想以后再遇到任何问题!哈哈,例如,承诺之间的竞赛,或者例如,为另一个用户设置的用户电子邮件。我不知道它们是否有可能发生,但我需要与您的专家核实,如果您确认这种方式或您是否提出其他建议。
解决方案
我会这样做。
const promises = ids.map(
id => ( [axios.get(`blabla/${id}/email`), axios.get(`blabla/${id}/name`)] )
);
Promise.all(promises.map(Promise.all).then(
([email, name]) => {
console.log(email, name)
}
)).then(values => {
console.log(values);
});
推荐阅读
- unity3d - 有什么方法可以改变 Unity 中自定义 Sprite 的 FilterMode?
- typescript - 可以选择在打字稿中扩展一种类型的道具?
- javascript - 根据另一个数组获取一个数组中元素的索引
- r - Rstudio没有读入文件
- python - 在 matplotlib 中创建非对称轴
- android - Android Studio 序列化
- google-analytics - 是否有一种解决方法可以在 Google Analytics(分析)中为同一目标创建多个渠道?
- redis - Dovecot 无法初始化 dict: dict redis: Invalid IP
- mysql - Wordpress Docker“建立数据库连接时出错”
- imagemagick - 在 MacOS Catalina 上安装 Imagick 时出错