鍍金池/ 問答/HTML/ vue項目怎么阻止很快速的點擊兩次然后提交的兩次請求

vue項目怎么阻止很快速的點擊兩次然后提交的兩次請求

像提交表單類似的數(shù)據(jù)的時候,連續(xù)點擊兩次會出現(xiàn)提交兩次請求,前端有沒有全局的js去控制這個?

回答
編輯回答
冷咖啡
  1. debouncethrottle是目前用得最廣泛的,具體可見樓上的一堆收藏;
  2. 想要確保邏輯上不會有同時提交的請求,npm搜“mutex”也有很多;
  3. 或者我也寫了一個簡易版的,用下面的函數(shù)包裹點擊回調(diào),如果前一次請求尚未結(jié)束,新請求會和舊請求一起返回。這樣的話回調(diào)要返回Promise

    const debounceAsync = originalFunction => {
      let currentExcution = null;
      const wrappedFunction = async function () {
        // 1. locked => return lock
        if (currentExcution) return currentExcution;
    
        // 2. released => apply
        currentExcution = originalFunction.apply(this, arguments);
        try {
          return await currentExcution;
        }
        finally {
          currentExcution = null;
        }
      };
      return wrappedFunction;
    };

    用法

    const sleep = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms));
    
    const debounceAsync_UNIT_TEST = async () => {
      const goodnight = debounceAsync(sleep);
      for (let i = 0; i < 8; i++) {
        goodnight(5000).then(() => console.log(Date()));
        await sleep(500);
      }
      console.warn('Expected output: 8 identical datetime');
    };

    https://segmentfault.com/a/11...

2017年4月15日 22:10
編輯回答
空白格

其實所有的接口請求都有這個需求,因此可以對ajax封裝一個代理層

代理層可以做兩個事情

  1. 緩存接口返回數(shù)據(jù),可以緩存到sessionstorage,也可以緩存到內(nèi)存,相同的請求先訪問緩存
  2. 給每個請求接口加狀態(tài),未請求、請求中、已完成。未請求時去請求接口,同時把此接口狀態(tài)置為請求中;請求中時再請求接口,將回調(diào)保存起來,接口數(shù)據(jù)返回以后,將數(shù)據(jù)存儲到緩存,一起回調(diào);已完成時請求接口,直接從緩存中讀取數(shù)據(jù),不再請求接口

這樣,不光是vue項目,也不光是post或者提交表單,所有的接口請求都具備了你需要的能力。

2018年1月12日 13:31
編輯回答
莫小染

方案一:申明一個變量,點擊時置灰提交按鈕。等接口調(diào)用結(jié)束放開按鈕。

<template>
<div>
    <!-- 其他代碼 -->
    <button v-if="canSave" @click="save">提交</button>
    <button v-else disabled>提交</button>
</div>
</template>
<script>
export default {
    data(){
        return {
            canSave: true,
        }
    },
    methods: {
        save(){
            if(!canSave){
                return;
            }
            this.canSave = false;
            // AJAX 結(jié)束后 this.canSave = true;
        },
    }
}
</script>

方案二:加防抖。放幾個之前收藏的鏈接:
JavaScript 函數(shù)節(jié)流和函數(shù)去抖應(yīng)用場景辨析
underscore 函數(shù)去抖的實現(xiàn)
underscore 函數(shù)節(jié)流的實現(xiàn)

JavaScript專題之跟著underscore學防抖
JavaScript專題之跟著 underscore 學節(jié)流

2017年1月30日 09:37
編輯回答
拽很帥

現(xiàn)在比較好的處理就是你在點擊之后,ajax請求完成之前將那個按鈕禁止點擊。

2017年5月1日 19:48