javascript - 使用 React 和 Redux 进行 api 调用队列?

标签 javascript arrays reactjs redux axios

我正在处理这样一种情况:每当我进行多个 api 调用时,它不应该同时调用所有 api,而是应该在 api 调用正在进行时将其推送到队列,一旦我得到响应,我就必须创建一个 api如果队列长度大于0,则从队列中调用。

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 调用都会被触发,并根据响应分派(dispatch)相应的操作,并且局部变量的值也已重置。所以我无法阻止 api 被调用。任何人都可以帮助实现此 api 调用队列,并建议我使用 javascript 或使用 redux 进行 react 来实现相同目的的最佳方法吗?

最佳答案

以下是如何使用 onlyLastRequestedPromise 的示例:

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

关于javascript - 使用 React 和 Redux 进行 api 调用队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58266985/

相关文章:

JavaScript 在使用 blob 构造函数时剪切长数值

javascript - phonegap openDatabase 无方法

javascript - 隐藏文本区域时无法复制到剪贴板

Javascript forEach,其中值等于不同数组中的值

javascript - function(i,x) { x(); 是否有任何 JavaScript/Underscore/jQuery 快捷方式? }?

php - 如何将数组值的数组组合成一个数组?

javascript - 高阶组件 : function keyword vs arrow function

javascript - 如何并行执行两个异步函数,然后等待它们完成?

javascript - 自定义 tradingview charting_library 标题

javascript - 如何使用 Angular i18n 来处理它似乎不支持的语言?