2016-03-19 8 views
0

ここでは、Ajaxアクション中に複数のリクエストを防止する一般的な解決方法を示します。副作用を導入せずに複数のAjaxリクエスタを防ぐ方法

let isRequesting = false 

$('#fetch').on('click',() => { 
    if(isRequesting) { 
     console.log('ajax still in progress, please wait') 
     return false 
    } 

    isRequesting = true 

    $.get(SOME_RESOURCE, (data) => { 
     console.log('success with :', data) 
     isRequesting = false 
    }) 
}) 

しかし、機能プログラムと同じように、私のアプリケーションの状態を変更することなく、この作業を終了するにはどうすればいいですか?

+0

個人的には、通常、クリックイベントの開始時にボタン/リンクを無効にして、成功/失敗のコールバックの終了時に有効にします。ほとんどの場合、これはユーザーにとって明確です。 – Obversity

+0

FPの目的は、不要な状態を排除し、合理的な方法で必要な状態を管理することです。この特定のシナリオでは、必要な状態を処理しています。コードが「準備完了」状態であるか「ロード中」状態であるかによって、コードが異なるように機能します。 – MarkNFI

答えて

0

状態を保持せずに行うことはできませんが、一般的なコンポーネントに状態をカプセル化することでよりきれいにすることができます。

(function($){ 
    $.fn.extend({ 
     smartOn: (type, funcHandler) => { 
      return this.each(function() { 
       let $me = $(this); 
       let isRequesting = false; 
       $me.on(type,() => { 
        if (isRequesting) { 
         console.log('ajax still in progress, please wait'); 
         return false; 
        } 

        isRequesting = true 

        funcHandler(() => { 
         isRequesting = false; 
        }); 
       }); 
      }); 
     } 
    }); 
})(jQuery); 

そして、このようにそれを呼び出す:たとえば

$('#fetch').smartOn("click", (callbackDone) => { 
    $.get(SOME_RESOURCE, (data) => { 
     console.log('success with :', data) 
     callbackDone(); 
    }) 
}); 

ただ、すべてのシナリオでcallbackDone()を呼び出すことを忘れないでください(つまり$.getが失敗した場合にも)。また、コールバックの代わりにプロミスを使用すると、少し見栄えが良くなります(特に、すべてのシナリオを$.getで処理する必要があります)。

関連する問題