使用Promise.all()Javascript解析多个JSON

时间:2019-02-23 03:10:33

标签: javascript json promise

这是我的用例: -我有两个网址,我发送相同的输入来填充参数 -我需要解析JSON响应并根据响应的键创建一个列表。

这是我到目前为止的代码:

function initialCall(input) {
  let urls = [
    `https://mybusinessendorsements.com/api/auth?token=0d34aa6dad5d50de697c62bdf8a633f4&industry=${input}`,
    `http://mybusinessendorsements.com/api_spn/auth?token=0d34aa6dad5d50de697c62bdf8a633f4&industry=${input}`
  ];

  let requests = urls.map(url => fetch(url));
  Promise.all(requests)
  .then(responses => responses.forEach(
    response => alert(`${response.json()}: ${response.status}`)
  ))};

//[object Promise]: 200
//[object Promise]: 200

我不确定如何获取json数组以进行打印以根据需要进行解析和操作,帮助!?

1 个答案:

答案 0 :(得分:2)

response.json()返回另一个Promise [1],因此您需要两次调用Promise.all,如下所示:

Promise.all(requests)
  .then(responses => Promise.all(responses.map(r => r.json())))
  .then(jsonObjects => /* ... */);

为了便于阅读,您可以引入一个辅助函数

Promise.all(requests)
  .then(toJSON)
  .then(jsonObjects => /* ... */);

function toJSON(responses) {

  if (!Array.isArray(responses)) {
    // also handle the non array case
    responses = [responses];
  }

  return Promise.all(responses.map(response => response.json()));

}

如果您需要保留响应(状态):

function resolveJSON(responses) {

  return Promise.all(
    responses.map(response => response.json()
      // will return an object with keys "response" and "json"
      .then(json => { response, json }))
    );

}

[1] https://developer.mozilla.org/en-US/docs/Web/API/Body/json