为了账号安全,请及时绑定邮箱和手机立即绑定

使用带有 Promise.all() 的配置对象

使用带有 Promise.all() 的配置对象

凤凰求蛊 2022-07-21 10:56:47
我正在研究使用 Promise.all() 从多个端点获取数据。使用 Promise.all() 返回一个数组,您可以从该数组中析构项目,例如const [fetch1, fetch2] = Promise.all(urls.map(url => fetch(url)))我正在寻找使用配置对象动态命名这些解构项目(name1 和 name2)的方法。const urls = [  {    name: 'google',    url: 'https://www.google.com'  },  {    name: 'bbc',    url: 'https://www.bbc.co.uk'  }]const [google, bbc] = Promise.all(urls.map(url => fetch(url.url)))在上述示例中,从 promise.all 解构的项目应使用 urls 数组中的名称,即 urls.name本质上,我正在寻找一种方法来在传递给 promise.all() 的配置对象中命名我的导出主要原因是从这些 promise 返回的数据是在 urls 配置对象中指定的名称下键入的。所以我们也可以const data = Promise.all(urls.map(url => fetch(url.url)))console.log(data.google || data.bbc)
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

这应该这样做:


const fetchUrl = (url) => fetch(url.url).then((response) => ({ [url.name]: response }));


const mergeResults = (results) => results.reduce(

  (mergedResults, result) => ({ ...mergedResults, ...result }),

  {}

);


const data = Promise

  .all(urls.map(fetchUrl))

  .then(mergeResults)

  .then((data) => {

    console.log(data.google || data.bbc);

  });

伯吉的更新:


const data = Promise

  .all(urls.map(fetchUrl)) // same as above

  .then((results) => Object.assign({}, ...results)) // elegance++

  .then((data) => {

    console.log(data.google || data.bbc);

  });


查看完整回答
反对 回复 2022-07-21
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信