Mam aplikację szkieletową, która ma wiele widoków. Przełączanie między widokami uruchamia żądania Ajax, aby uzyskać różne kolekcje. Chciałbym zatrzymać aktualną prośbę ajaxową, jeśli zostanie rozpoczęta nowa. Czy to możliwe?Czy można zatrzymać żądanie "odczytu" kręgosłupa
Odpowiedz
Ok, więc tutaj jest to, co zrobiłem
ja zapisując fetch żądania w zmiennej
app.fetchXhr = this.model.fetch();
W moim routerze, mam funkcję, która dba o zamknięciu poglądy i renderowania widoki . Dba również o wyzwalanie wszelkich wyzwalaczy wymaganych dla każdej zmiany widoku, ale nie ma to znaczenia w tym pytaniu.
Zanim cokolwiek, to funkcja routera wykonuje następujące
//Stop pending fetch
if(app.fetchXhr.readyState > 0 && app.fetchXhr.readyState < 4){
app.fetchXhr.abort();
}
Mam nadzieję, że to pomoże
Zakładam, że używasz szkieletu z jQuery. Jeśli tak, to następujące pytanie wydaje się stanowić odpowiedź dla Ciebie:
Abort Ajax requests using jQuery
Backbone fetch
zwraca xhr
Mówią o, IIRC.
Prawdopodobnie późną odpowiedź :)
Wykorzystanie limitu czasu, aby określić wartość limitu czasu. Spowoduje to wyłączenie funkcji błędu. Tutaj zapytanie może zostać przerwane.
Czy istnieje jakiś powód, dla którego chcesz przerwać zapytanie?
Chciałbym przerwać, ponieważ jeśli zmienię widok przed zakończeniem zapytania, błąd zostanie wygenerowany po zakończeniu pobierania i usunięciu widoku. – Xerri
Jeszcze jedna spóźniona odpowiedź na wypadek, gdyby ktoś inny się na to natknął.
Skończyło się na zastąpieniu Backbone.sync, aby dodać pulę obiektów XHR i opcję przerwania oczekujących żądań przy pobieraniu.
var sync = Backbone.sync
, xhrPool = [];
Backbone.sync = function(method, model, options) {
options = options || {};
if (method === 'read') {
if (options.abortPending == true) {
for (var i = 0; i < xhrPool.length; i++) {
if (xhrPool[i]['readyState'] > 0 && xhrPool[i]['readyState'] < 4) {
xhrPool[i].abort();
xhrPool.splice(i, 1);
}
}
}
// cleanup xhrPool
// todo: make removal from the pool an 'always' jqXHR callback
// instead of cleanup on every read?
for (var i = 0; i < xhrPool.length; i++) {
if (xhrPool[i]['readyState'] === 4) {
xhrPool.splice(i, 1);
}
}
var xhr = sync(method, model, options);
xhrPool.push(xhr);
return xhr;
} else {
return sync(method, model, options);
}
};
Bardzo fajnie .... może nie być elastyczne, jeśli wykonujesz wiele żądań pobierania w określonym widoku. FYI ... Jednym z powodów, dla których tego potrzebowałem, było uniknięcie błędów generowanych po zakończeniu pobierania, ale widok się zmienił (więc element DOM, który zawierał dane, już nie istnieje). Prosta próba/catch wokół pobierania naprawiła to. – Xerri
- 1. Czy można zatrzymać walker?
- 2. Czy można zatrzymać wymianę pamięci na dysk?
- 3. Czy można zatrzymać automatyczne pobieranie obiektu ObjectDataSource?
- 4. Czy można zatrzymać zbieranie śmieci .NET?
- 5. Czy można zatrzymać wykonywanie w javascript/jquery?
- 6. node.js: jak zatrzymać już uruchomione żądanie http
- 7. Czy wyzwalacz kręgosłupa() jest synchroniczny czy asynchroniczny?
- 8. Czy można wysłać żądanie POST w kolbie?
- 9. Czy można wykonać bezpieczne żądanie JSONP?
- 10. Nie można zatrzymać drukowania
- 11. routing kręgosłupa wykrywanie, czy do przodu czy do tyłu wciśnięty
- 12. Jak można zablokować potwierdzenie odczytu?
- 13. Nie można zatrzymać odtwarzacza AVPlayer
- 14. Jak sklonować kolekcję kręgosłupa
- 15. Kolekcja kręgosłupa z wieloma modelami?
- 16. Łapanie błędów synchronizacji kręgosłupa
- 17. Czy można zatrzymać pojedynczy wątek podczas debugowania w systemie Linux?
- 18. Czy można zatrzymać javascript w Firebug bez użycia breakpointów?
- 19. Niestandardowe zdarzenia kręgosłupa
- 20. Weryfikacja kręgosłupa nie działa
- 21. Czy można bezpiecznie używać XMLDecoder do odczytu plików dokumentów?
- 22. Czy istnieje sposób kręgosłupa do formatowania liczb w widoku?
- 23. Czy potrzebuję TThreads? Jeśli tak, mogę zatrzymać, wznowić i zatrzymać?
- 24. Żądanie odczytu pozwolenie od własnego ContentProvider w innej aplikacji
- 25. Czy można wyzwolić żądanie HTTP DELETE z formularza HTML?
- 26. Czy można zainicjować kolekcję kręgosłupa za pomocą identyfikatorów obiektów, a nie obiektów?
- 27. Jak umiędzynarodowić kierownicę + widok kręgosłupa?
- 28. Widok kręgosłupa z dynamicznym id
- 29. Nie można usunąć ani zatrzymać programu AVPlayer
- 30. Widok kręgosłupa - nie jest zdefiniowany
Mam powiązany problem, ale mam więcej niż jedną kolekcję. Zanim przerwiemy żądanie, muszę mieć pewność, że jest on powiązany z określoną kolekcją. Zadałem to pytanie tutaj, być może już poradziłeś sobie z tym problemem? http://stackoverflow.com/questions/21919690/association-between-backbone-collection-and-xhr-object-created-when-fetching – wuliwong
Nie zaimplementowałem tego jeszcze, ale jedną rzeczą, którą możesz spróbować, to przechowywać wszystkie xhr żądania w tablicy. Na każdym żądaniu xhr lub przy każdej zmianie widoku możesz przechodzić przez tablicę, aby usunąć te, które są kompletne i zatrzymać te, które chcesz zatrzymać. To powinno zapewnić odpowiednie oczyszczenie. – Xerri