Javascript 使用react with redux对api调用进行排队?
我正在处理这样一种场景,即每当我进行多个api调用时,它不应该同时调用所有api,而应该在api调用进行时推送到队列中,并且一旦我得到响应,如果队列长度大于0,我就必须从队列中进行api调用Javascript 使用react with redux对api调用进行排队?,javascript,arrays,reactjs,redux,axios,Javascript,Arrays,Reactjs,Redux,Axios,我正在处理这样一种场景,即每当我进行多个api调用时,它不应该同时调用所有api,而应该在api调用进行时推送到队列中,并且一旦我得到响应,如果队列长度大于0,我就必须从队列中进行api调用 let queueToBeExecuted = []; let apiInProgressCheck = false; const apiInProgressCheckFn = (data,url) => { apiInProgressCheck = data; if (apiInProgre
let queueToBeExecuted = [];
let apiInProgressCheck = false;
const apiInProgressCheckFn = (data,url) => {
apiInProgressCheck = data;
if (apiInProgressCheck === true ){
queueToBeExecuted.push(url);
console.log('queue', queueToBeExecuted)
}
else {
const itemToAdd = queueToBeExecuted.shift();
console.log('shift', queueToBeExecuted)
// i have to make a api call again
}
return apiInProgressCheck;
}
const makingAnApiCall = async (url) => {
response = await axios({ url, method: get });
if (response.status) {
apiInProgressCheckFn(false, url);
if (response.status === 200 || response.status === 201) {
dispatch(success(response));
} else {
dispatch(failed(response));
}
}
};
export default makingAnApiCall;
我已经创建了名为“makingAnApiCall”的javascript函数,每当我调用该函数时,api调用都会被触发,并根据响应分派相应的操作,并且局部变量的值也已重置。所以我无法阻止api被调用。任何人都可以帮助实现此api调用队列,并建议我使用javascript或react with redux实现此队列的最佳方法吗?下面是一个如何使用的示例:
以下是如何使用的示例:
这会使你的应用程序速度慢得多,你想这样做是因为基于用户输入进行api调用,而你只想解决最后一个问题吗?是的,基于用户输入..我不确定我是否完全理解你的问题,您想在执行上一个API调用后找到一种执行这些API调用的方法吗?只有当它是最后一个用户输入时,您才能解析。可能会有帮助。这会让你的应用程序慢很多,你想这样做是因为根据用户输入进行api调用,而你只想解决最后一个问题吗?是的,根据用户输入..我不确定我是否完全理解你的问题,您想在执行上一个API调用后找到一种执行这些API调用的方法吗?只有当它是最后一个用户输入时,您才能解析。也许我能帮上忙。
const makingAnApiCall = async (url, last = x => x) => {
let response;
try {
response = await last(axios({ url, method: get }));
} catch (e) {
if (e === 'A newer request was made.') {
//ignore this error, current request replaced
// with newer one
return;
}
//something else went wrong, rethrow the error
throw e;
}
if (response.status) {
apiInProgressCheckFn(false, url);
if (
response.status === 200 ||
response.status === 201
) {
dispatch(success(response));
} else {
dispatch(failed(response));
}
}
};
//IIFE to initialize last only once
const lastSearchApiResult = (() => {
const last = onlyLastRequestedPromise('search');
return url => makingAnApiCall(url, last);
})();