Ich baue eine React/Redux-App mit der Redux-Thunk-Middleware, um Ajax-Anfragen zu erstellen und zu bearbeiten. Ich habe einen bestimmten Thunk, der ziemlich oft gefeuert wird, und ich möchte alle zuvor gestarteten Ajax-Anfragen abbrechen, bevor ich einen neuen starte. Ist das möglich?Abbrechen der vorherigen asynchronen Aktion mit redux-thunk
Antwort
Ein Ansatz wäre, diese Anfragen als abgebrochen zu markieren, indem man ihnen eine zufällige ID gibt und ihren Status überprüft, bevor das Ergebnis behandelt wird.
Der Weg dies zu tun ist, zufällige ID für diesen Anruf in Ihrem ersten Versand (innerhalb der Thunk) zuzuordnen und überprüfen Sie es in der Reducer vor der Behandlung des Ergebnisses.
const actionId = Math.random();
dispatch({type: AJAX_LOAD_CONST, id:actionId })
Wenn Sie alle die Anforderung abbrechen möchten verwenden
dispatch({type:HANDLE_AJAX_RESPONSE, id:actionId, results: json })
Wenn Sie die Ergebnisse behandeln möchten, vergessen Sie nicht die ID senden, die Sie u
und in die Reduzierung haben etwas in der Art:
function reducer(state = initialState, action) {
switch (action.type) {
case actions.AJAX_LOAD_CONST:
return Object.assign({}, state, { ajax: state.ajax.concat(action.id) });
case actions.CANCEL_ALL_AJAX:
return Object.assign({}, state, { ajax: [] });
case actions.HANDLE_AJAX_RESPONSE:
if (state.ajax.includes(action.id) {
//return state reduced with action.results here
}
return state;
}
}
Wenn Sie XMLH verwenden ttpRequest oder eines seiner Wrapper (JQuery?) Sie können die Anfragen auch selbst speichern und request.abort() aufrufen. Wenn Sie die neue Fetch Api verwenden, haben Sie diesen Luxus nicht, da Versprechen dieses Verhalten nicht haben.
Sie können Ihren Aktionsersteller dazu bringen, das Versprechen zurückzugeben, es wird von der Versandfunktion zurückgegeben, dann kann es abgebrochen werden. Hier ein Beispiel:
Aktion Schöpfer
function doSomething() {
return (dispatch) => {
return $.ajax(...).done(...).fail(...);
}
}
Ihre Komponente
componentDidMount(){
this.previousPromise = this.props.dispatch(doSomething());
}
somefnct() {
this.previousPromise.abort();
}
- 1. Erkennungsbefehl im asynchronen BeginExecuteReader abbrechen
- 2. Abbrechen kafka Partition Aktion zuweisen
- 3. React Native - Navigieren nach einer asynchronen Aktion
- 4. Redux-Saga ruft Aktion nach Abbrechen
- 5. Wie Abbrechen einer ASP.NET MVC Aktion
- 6. Wie kann ich einen asynchronen Delegaten in C# 3.5 abbrechen?
- 7. Implementieren der asynchronen Methode
- 8. Scriptaculous Ajax.InPlaceEditor: Wie Abbrechen Aktion auslösen?
- 9. eine Saga abbrechen, wenn eine Aktion mit redux-Saga versandt
- 10. UIScrollView Mit dem nächsten und vorherigen Button Aktion
- 11. Angular2 - Wiederherstellen des vorherigen Werts beim Abbrechen in Zweiwege-Datenbindung
- 12. Erwarte das Überschreiben der vorherigen Variablen in der asynchronen Methode, mehrere erwarten
- 13. Abbrechen der Navigation mit Meteor Eisen-Router
- 14. React Router + Redux - Versenden einer asynchronen Aktion bei einer Routenänderung?
- 15. Aktualisieren der Spaltenwerte mit der vorherigen Zeile
- 16. Handhabung der asynchronen Programmierung mit Ramda
- 17. Fähigkeit, asynchronen Aufruf abzubrechen
- 18. ASP.NET MVC2 - Rückkehr zur vorherigen Ansicht von einer Controller-Aktion
- 19. applicationWillTerminate und das Dock, aber diese Aktion abbrechen möchten
- 20. Erzwingen der synchronen Ausführung der asynchronen Aktion in ASP.NET MVC 4
- 21. Wie kann ich eine Touch-Aktion auf Mobile Safari abbrechen?
- 22. UIActivityViewController-Vervollständigungshandler ruft weiterhin Aktion auf, wenn Benutzer Abbrechen drückt
- 23. zurück zum vorherigen Controller und die Aktion in mvc.net Rerouting
- 24. Die ausstehende Aktion der vorherigen Route bei Seitenwechsel in der Redux-App ablehnen
- 25. Abbrechen der AJAX-Anfrage
- 26. Asynchronen Webdienst abbrechen Anrufen und an eine andere URL umleiten (ASP.NET Ajax)
- 27. Reihenfolge der asynchronen HTTP-Anfragen
- 28. Sync-Version der asynchronen Methode
- 29. Valgrind Abbrechen mit der "getötet" Nachricht
- 30. jQuery - Abbrechen der Formularübergabe (mit "return false"?)?