2016-03-19 5 views
0

Hier ist die allgemeine Lösung, um mehrere Anfragen während Ajax-Aktion zu verhindern.So verhindern Sie mehrere Ajax-Requets ohne die Einführung von Nebenwirkungen

Aber wie kann ich diese Arbeit beenden, ohne irgendwelche Zustände in meiner App zu ändern, genau wie funktionale Programme tun.

+0

Persönlich würde ich normalerweise die Schaltfläche/den Link zu Beginn des Click-Ereignisses deaktivieren und am Ende des Erfolgs-/Fehler-Callbacks aktivieren. Dies ist in den meisten Fällen für die Benutzer klarer. – Obversity

+0

Das Ziel in FP ist, unnötigen Zustand zu beseitigen und notwendigen Zustand in einer vernünftigen Weise zu verwalten. In diesem speziellen Szenario haben Sie es mit dem erforderlichen Status zu tun - Sie möchten, dass Ihr Code je nachdem, ob er sich im Status "Bereit" oder "Laden" befindet, unterschiedlich funktioniert. – MarkNFI

Antwort

0

Sie können es nicht ohne Zustand zu halten, aber man kann es schönere machen, indem Sie den Zustand in einer generischen Komponente eingekapselt wird. Zum Beispiel:

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

Und dann es so nennen:

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

Denken Sie daran callbackDone() in jedem Szenario zu nennen (das heißt auch, wenn $.get ausfällt). Wenn Sie Promises anstelle von Callbacks verwenden, kann es auch ein wenig netter aussehen (insbesondere die Notwendigkeit, jedes Szenario mit $.get zu behandeln).

Verwandte Themen