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



当我尝试同时运行多个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作为单独的同步调用?

我解决了我的问题,实际上它既不是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成为一个全局变量。当然,它是一个全局变量,这意味着所有同时调用的函数在填充来自服务器的数据时共享同一个变量。

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");

相关内容

  • 没有找到相关文章

最新更新