欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS實現(xiàn)"上次操作未完成禁止新操作"邏輯特事特辦方案

 更新時間:2023年05月16日 11:27:31   作者:知名噴子  
這篇文章主要介紹了詳解JS如何實現(xiàn)"上次操作未完成禁止新操作"的邏輯及思路,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

場景

相信很多人都遇到過類似的場景:

某一個按鈕是用來發(fā)送請求的,并且需要一段時間來處理。但是用戶往往會在處理期間有意或無意地點擊多次,因此我們希望在上一次發(fā)出的請求處理完畢之前,不再發(fā)出新的請求。

1.初步解決方案:特事特辦

“特事特辦”的意思,就是每次遇到這樣的場景,都特意寫一段邏輯來處理:

document.addEventListener('click', (() => {
    let lock = false;
    return () => {
        if(lock) return;
        lock = true;
        console.log('clicked');
        // 為了方便測試就使用延時了
        setTimeout(() => {
            lock = false;
        }, Math.random() * 4e3)
    }
})());

2. 基于約定回調(diào)的條件式回調(diào)函數(shù)

上面的寫法其實也不費事,但是這種條件限制能不能像已經(jīng)被面試問爛了的“節(jié)流”和“防抖”那樣,用一個函數(shù)把它包裹起來就可以達成效果呢?
問題的關(guān)鍵其實在于:防抖和節(jié)流需要考慮的執(zhí)行條件是時間,這個條件對于所有函數(shù)而言都是一個“共同的語言”,因此才雙方可以做到那樣的“默契”。
而要在這種場景里實現(xiàn)同樣的效果,雙方需要刻意的約定:例如被條件執(zhí)行的函數(shù)額外接受一個函數(shù),用于在合適的時機解除條件限制。

function conditioned(callback:(release:Function,...args:any[]) => any){
    let lock = false;
      return function(...args:any[]){
        if(lock) return;
        lock = true;
        callback.call(this, () => {
              lock = false;
        }, ...args);
      }
}

 ?? 為了方便描述這種約定對callback 的要求,這里使用 TS 而不是 JS。

使用的時候:

button.addEventListener('click', conditioned((release) => {
    return () => {
        console.log('clicked');
        setTimeout(() => {
            release(); // 釋放 lock
        }, Math.random() * 4e3);
    }
}));

3. 基于 Promise 的條件式回調(diào)函數(shù)

如果說有什么方法能比回調(diào)函數(shù)更“優(yōu)雅”、更“通用”一些,答案顯然是Promise。

因為上面的寫法對原來的回調(diào)函數(shù)的參數(shù)進行了改寫,遇到一個愛好 Ctrl + C 的初學(xué)者的話,他會疑惑復(fù)制過來的函數(shù)為什么就不工作了。

function conditioned(callback:(...args:any[]) => Promise<any>){
    let lock = false;
    return function(...args:any[]){
        if(lock) return;
        lock = true;
        try {
            await callback.call(this, ...args);
            lock = false;
        } catch(err) {
            lock = false;
            throw err;
        }
    }
}

使用方法:

button.addEventListener('click', conditioned(() => {
  return new Promise((resolve) => {
      console.log('clicked');
      setTimeout(() => {
          resolve(); // 釋放 lock
      }, Math.random() * 4e3);
  });
}));

雖然乍一看,使用這個函數(shù)意味著必須把回調(diào)函數(shù)的返回值改寫成 Promise,不過由于這種場景往往都是異步操作,改成 async 何樂而不為呢?

4. React hook 版

import { useRef } from 'react';
function useCondition(callback: (...args: any[]) => Promise<any>) {
  const lock = useRef(false);
  return async (...args:any[]) => {
    if(lock.current) return;
    lock.current = true;
    try{
      await callback(...args);
      lock.current = false
    } catch(error){
      lock.current = false;
      throw error;
    }
  };
}

使用方法:

<button
  onClick={useCondition(() => {
    return new Promise<void>((resolve) => {
      console.log('clicked');
      setTimeout(() => {
          resolve(); // 釋放 lock
      }, Math.random() * 4e3);
    });
  })}
>測試</button>

 ??實際上沒測試過,不知道行不行的,更多關(guān)于JS 上次未完成禁止新操作的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用JS實現(xiàn)加減簡易計算器

    利用JS實現(xiàn)加減簡易計算器

    這篇文章主要為大家詳細介紹了如何利用JavaScript制作一個簡單的網(wǎng)頁版加減計算器,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-05-05
  • 多種js圖片預(yù)加載實現(xiàn)方式分享

    多種js圖片預(yù)加載實現(xiàn)方式分享

    這篇文章主要為大家詳細介紹了多種js圖片預(yù)加載實現(xiàn)方式,包括html標簽或css加載圖片、純js實現(xiàn)預(yù)加載,感興趣的小伙伴們可以參考一下
    2016-02-02
  • QRCode.js二維碼生成并能長按識別

    QRCode.js二維碼生成并能長按識別

    這篇文章主要為大家詳細介紹了QRCode.js二維碼生成并能長按識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • javascript正則表達配置擴展名并實現(xiàn)驗證

    javascript正則表達配置擴展名并實現(xiàn)驗證

    這篇文章主要介紹了javascript正則表達配置擴展名并實現(xiàn)驗證,文章圍繞主題展開相關(guān)資料,具有以得參考價值,需要的小伙伴可以參考一下
    2022-02-02
  • JS XMLHttpRequest原理與使用方法深入詳解

    JS XMLHttpRequest原理與使用方法深入詳解

    這篇文章主要介紹了JS XMLHttpRequest原理與使用方法,結(jié)合實例形式深入分析了JS XMLHttpRequest相關(guān)原理、使用方法及操作注意事項,需要的朋友可以參考下
    2020-04-04
  • JavaScript編寫點擊查看大圖的頁面半透明遮罩層效果實例

    JavaScript編寫點擊查看大圖的頁面半透明遮罩層效果實例

    這篇文章主要介紹了JavaScript制作點擊查看大圖的頁面遮罩層效果實例,透明部分這里使用的是CSS3的rgba,兼容性還是過得去的,需要的朋友可以參考下
    2016-05-05
  • js 圖片懶加載的實現(xiàn)

    js 圖片懶加載的實現(xiàn)

    這篇文章主要介紹了js 圖片懶加載的實現(xiàn),幫助大家更好的優(yōu)化自身網(wǎng)頁,提高網(wǎng)頁響應(yīng)速度,感興趣的朋友可以了解下
    2020-10-10
  • 一個關(guān)于javascript匿名函數(shù)的問題分析

    一個關(guān)于javascript匿名函數(shù)的問題分析

    一個關(guān)于javascript匿名函數(shù)的問題分析,學(xué)習js的朋友可以參考下
    2012-03-03
  • JS隱藏號碼中間4位代碼實例

    JS隱藏號碼中間4位代碼實例

    這篇文章主要介紹了JS隱藏號碼中間4位,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-04-04
  • 小程序如何獲取多個formId實現(xiàn)詳解

    小程序如何獲取多個formId實現(xiàn)詳解

    這篇文章主要介紹了小程序如何獲取多個formId實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2019-09-09

最新評論