javascript 如何让Axios同时从多个来源获取数据,而不会混合数据?

zkure5ic  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(136)

当我尝试使用循环同时运行多个axios操作从不同的数据源获取数据时,收到的数据会混合,因此会损坏。
我尝试为每个数据源创建不同的axios示例,但据我所知,axios全局参数似乎覆盖了单个示例的URL。
我已经写了一个简单的例子,通常重现了这个问题:

const axios = require('axios');
const axiosObjs = {};

async function get_data(dataSetName) {

    let dataToSave = [];

    if (!axiosObjs[dataSetName]) {
        axiosObjs[dataSetName] = axios.create({
            method: 'get',
            url: 'https://example.com/dataSets/',
        });
    }

    for (let i = 0; i < 10; i++) {
        const urlString = 'https://example.com/dataSets/' + dataSetName + "_" + i;

        const dataSetChunk = await axiosObjs[dataSetName](urlString)
            .then(result => result) 
            .catch((err) => { return "this is just a simplified example"; });

        dataToSave = [].concat(dataToSave, dataSetChunk.data);

        await wait_milliseconds(500);  // made up function, waits half a second
    }
    
    save_data_to_file(dataSetName, dataToSave);  // made up function, saves data to file
}

// these all result in data mixed up between saved data sets
get_data("dataSet1");
get_data("dataSet2");
get_data("dataSet3");

产生的文件包括来自每个数据源的混合数据,显然是因为循环同时发生,其中循环的每次迭代在单独的函数调用中覆盖彼此的参数。
如何避免这个问题,而不必将get_data作为单独的同步调用运行?

brccelvz

brccelvz1#

我解决了我的问题,而且令人尴尬的是,它实际上既不是axios也不是服务器相关的。
这个问题源于我在下面的例子中用粗体显示的一个const关键字(例子下面的解释):

const axios = require('axios');
const axiosObjs = {};

async function get_data(dataSetName) {

    let dataToSave = [];

    if (!axiosObjs[dataSetName]) {
        axiosObjs[dataSetName] = axios.create({
            method: 'get',
            url: 'https://example.com/dataSets/',
        });
    }

    for (let i = 0; i < 10; i++) {
        const urlString = 'https://example.com/dataSets/' + dataSetName + "_" + i;

        **const** dataSetChunk = await axiosObjs[dataSetName](urlString)
            .then(result => result) 
            .catch((err) => { return "this is just a simplified example"; });

        dataToSave = [].concat(dataToSave, dataSetChunk.data);

        await wait_milliseconds(500);  // made up function, waits half a second
    }
    
    save_data_to_file(dataSetName, dataToSave);  // made up function, saves data to file
}

// these all result in data mixed up between saved data sets
get_data("dataSet1");
get_data("dataSet2");
get_data("dataSet3");

当我创建简化的示例发布在StackOverflow上时,我在定义dataSetChunk常量时包含了const关键字。但在实际代码中,我不小心没有包含const关键字,JavaScript是JavaScript,它只是继续将dataSetChunk作为全局变量。当然,它是一个全局变量,这意味着所有同时发生的函数调用在从服务器填充数据时共享同一个变量。

xqkwcwgp

xqkwcwgp2#

const axios = require('axios');

async function get_data(dataSetName) {
  let unordered_data_chunks = [];
  let promises_to_await = [];

  for (let i = 0; i < 10; i++) {
    let data_source_url = 'https://example.com/dataSets/' + dataSetName + "_" + i;

    let promise = axios.get(data_source_url)
      .then((res) => {
        let data_chunk = {
          index: i,
          data: res.data
        };
        unordered_data_chunks.push(data_chunk);
      })
      .catch((err) => {
        // Do something to handle error.
      });

    promises_to_await.push(promise);
  }

  await Promise.all(promises_to_await);

  let ordered_data_chunks = unordered_data_chunks.sort(
    (a, b) => a.index - b.index
  );

  let data = ordered_data_chunks.reduce(
    (accumulator, current_value) => {
      accumulator.push(current_value.data);
      return accumulator;
    },
    []
  );

  save_data_to_file(dataSetName, data);
}

get_data("dataSet1");

相关问题