当我尝试使用循环同时运行多个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
作为单独的同步调用运行?
2条答案
按热度按时间brccelvz1#
我解决了我的问题,而且令人尴尬的是,它实际上既不是axios也不是服务器相关的。
这个问题源于我在下面的例子中用粗体显示的一个const关键字(例子下面的解释):
当我创建简化的示例发布在StackOverflow上时,我在定义
dataSetChunk
常量时包含了const
关键字。但在实际代码中,我不小心没有包含const
关键字,JavaScript是JavaScript,它只是继续将dataSetChunk
作为全局变量。当然,它是一个全局变量,这意味着所有同时发生的函数调用在从服务器填充数据时共享同一个变量。xqkwcwgp2#