Javascript 使用react with redux对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

我正在处理这样一种场景,即每当我进行多个api调用时,它不应该同时调用所有api,而应该在api调用进行时推送到队列中,并且一旦我得到响应,如果队列长度大于0,我就必须从队列中进行api调用

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);
})();