javascript - 循环获取,保持结果顺序

标签 javascript promise fetch-api

我有一种情况,我需要遍历一个 URL 数组并获取结果,但我需要保留请求的顺序,即第一个请求应该首先“保存”(写入文件),依此类推.请求的结果是文本文件,它们的内容没有任何显示原始 URL 或顺序的数据。

我在下面做了一个演示,它获取虚拟 JSON 数据。

let promises = [];
let data = [];
let i = 1;

let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');

const fn = async() => {
  while (i < 5) {
    promises.push(
      fetch('https://reqres.in/api/users/' + i, {
        mode: 'cors',
        headers: headers
      })
      .then(response => response.json())
      .then(json => {
        data.push(json)
      })
    )
    i++;
  }

  await Promise.all(promises).then(() => {
    console.log(data);
  })
}

fn();


如果你测试上面的代码,你可以看到结果是随机排序的(基于id),而且由于我的原始代码中的文件是文本文件,所以我在fetch之后无法排序。

最佳答案

使用 promise 解析的值。无需单独保留 data数组并手动将值添加到其中。 Promise.all确保值与 promise 的顺序相同。

let promises = [];
let i = 1;

let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');

const fn = async() => {
  while (i < 5) {
    promises.push(
      fetch('https://reqres.in/api/users/' + i, {
        mode: 'cors',
        headers: headers
      })
      .then(response => response.json())
    )
    i++;
  }

  await Promise.all(promises).then(data => {
    console.log(data);
  })
}

fn();

而且由于您处于异步功能中,因此您可以执行以下操作:
var data = await Promise.all(promises);
console.log(data);

关于javascript - 循环获取,保持结果顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60658122/

相关文章:

javascript - 使用 KineticJS 时不会加载 Google 字体

javascript - 如何使用Angular js将json中的数据绑定(bind)到li

javascript - 一旦所有延迟完成就调用一个方法?

javascript - Bluebird promise 多个参数

javascript - 发送自定义用户代理字符串以及我的 header (获取)

javascript - 在 React Native 中加载图像时如何获取响应 header ?

javascript - 按频率对 Javascript 数组进行排序,然后过滤重复

javascript - 可视化显示所需的属性

javascript - React-Redux 将 google Places api 变成了 promise

javascript - 使用 fetch post 请求进行正确的 Django CSRF 验证