【问题标题】:how to return two results from promise如何从承诺返回两个结果
【发布时间】:2020-02-29 01:34:53
【问题描述】:

我正在使用 fetch 从两个不同的 api:s 获取数据。我需要在同一个函数中使用两个 api 数据。一个比另一个完成得快得多,所以为了完成这项工作,我使用了 promise.all。但现在我被两个问题困住了。

  1. 如何将 2 个结果(test1 和 test2)返回到下一个 promise?现在我的代码停止并说“未定义 test1”。

  2. 如果我使用 promise.all 然后在每个文件上运行 .json(如下面的代码),代码会在返回结果之前等待每个 json 完成吗?或者可能没有完成?

代码:

Promise.all([fetch1, fetch2])
    .then((file) => {
      let test1 = file[0].json()
      let test2 = file[1].json()
      return ([test1, test2])
    }).then((data) => {
      console.log(test1)
      console.log(test2)
    })

【问题讨论】:

  • push()每个结果成一个数组?

标签: javascript promise


【解决方案1】:

您可以在.then 内的两个.json 调用中返回Promise.all

Promise.all([fetch1, fetch2])
    .then((file) => {
      let test1 = file[0].json()
      let test2 = file[1].json()
      return Promise.all([test1, test2])
    }).then(([test1, test2]) => {
      console.log(test1)
      console.log(test2)
    })

但最好将fetch 请求和.map 都带到他们的.json() Promises,然后在结果上调用Promise.all

const getApi = url => fetch(url).then(res => res.json());
Promise.all([
  getApi('url1'),
  getApi('url2')
])
  .then(([test1, test2]) => {
    // do stuff with test1 and test2
  })
  .catch((err) => {
    // handle errors
  });

上面的代码会导致请求被并行处理;两个请求都不会阻止另一个请求继续。相比之下,您的(经过调整的)原始代码将要求在.json()(处理正文)之前接收和处理来自两个请求的响应标头,以便两者都可以开始。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2017-05-16
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多