js给同一组件同一请求的调用加锁

我开发的一个页面,同时多次使用了同一个组件,但是这个组件一加载就会调用同一个方法,最终同时调用同一接口。

但是我们后端对于同一接口的调用频率进行了限制,不允许短时间内重复提交,需要在一个时间间隔后提交才能请求成功。

原代码为:

onMounted(() => {
  const code = item.value.code;
  ocrServerConfigDetail(code);
});

const ocrServerConfigDetail = (code) => {
  return new Promise((resolve, reject) => {
    TaskApi.ocrServerConfigDetail({
      code,
    })
      .then((res) => {
        const data = res.data;
        if (data.code === 200) {
          if (data.data) {
            item.value.paramList = data.data.paramList;
          }
        } else {
          Toast.fail(data.message);
          reject();
        }
      })
      .catch((error) => {
        if (error.message !== "") {
          Toast.fail(error.message);
        }
        reject(error);
      });
  });
};

我采用加锁方式解决这个问题,使用sessionStorage进行全局的锁存储。

新代码为:

onMounted(() => {
  const code = item.value.code;
  ocrServerConfigDetailAddLock(code);
});

const ocrServerConfigDetailAddLock = (code) => {
  if (sessionStorage.isOCRLocked == 1) {
    setTimeout(() => {
      ocrServerConfigDetailAddLock(code);
    }, 600);
  } else {
    if (code) {
      ocrServerConfigDetail(code);
      console.log(code);
    }
  }
};

const ocrServerConfigDetail = (code) => {
  sessionStorage.isOCRLocked = 1;
  return new Promise((resolve, reject) => {
    TaskApi.ocrServerConfigDetail({
      code,
    })
      .then((res) => {
        const data = res.data;
        if (data.code === 200) {
          if (data.data) {
            item.value.paramList = data.data.paramList;
          }
        } else {
          Toast.fail(data.message);
          reject();
        }
      })
      .catch((error) => {
        if (error.message !== "") {
          Toast.fail(error.message);
        }
        reject(error);
      })
      .finally(() => {
        sessionStorage.isOCRLocked = 0;
      });
  });
};

 

posted @ 2024-11-18 16:23  罗毅豪  阅读(2)  评论(0编辑  收藏  举报