Annulla richiesta GWT RequestFactory
-
22-10-2019 - |
Domanda
C'è un modo per annullare / abort richieste Richiesta di fabbrica? Utilizzando GWT 2.3
Soluzione
Un'altra opzione sarebbe quella di creare un tipo com.google.web.bindery.requestfactory.shared.RequestTransport
alternativa, invece di utilizzare DefaultRequestTransport
. Aspetto negativo di questo (e rialzo per l'approccio di BobV) è che non si sa quando nella richiesta sul server si uccide, quindi potrebbe aver già eseguito alcuni dei vostri metodi - non sarà possibile ottenere un feedback da nessuno di loro, ti basta smettere la richiesta in uscita.
Ho il sospetto che questo è il motivo per cui RF non ha questa funzione già, come fa RPC. Prendere in considerazione anche il caso della RPC se o RequestBuilder - come si fa quelli notificare al server che hanno cambiato la loro mente, e di non eseguire la richiesta? La mia comprensione è che non lo fanno - l'unico modo in cui sono chiusi precoce è quando cercano di lettura / scrittura alla risposta, e ottenere un errore di tcp, in quanto la connessione è stata chiusa. (E 'possibile mi sbaglio, e che un altro thread tiene d'occhio lo stato della connessione TCP e chiama thread.stop(Throwable)
, ma fermata è stato sconsigliato per un bel po '.)
Un pensiero sarebbe quello di inviare un messaggio al server, dicendogli di uccidere altre richieste dalla stessa sessione - ciò richiederebbe la partecipazione attiva nel codice del server, però, forse realizzato generica in un sottotipo ServiceLayerDecorator
, probabilmente in almeno invoke
, loadDomainObject(s)
, e getSetter
, tra gli altri. Questo è abbastanza chiaramente coinvolti per chiedere GWT a costruirlo per voi se ...
Altri suggerimenti
Non v'è alcun modo per annullare una richiesta dopo che il metodo fire()
è stato chiamato. Prendere in considerazione la costruzione di una classe base Receiver
personalizzato come il seguente:
public abstract class CancelableReceiver<V> extends Receiver<V> {
private boolean canceled;
public void cancel() {
canceled = true;
}
@Override
public final void onSuccess(V response) {
if (!canceled) {
doOnSuccess(response);
}
}
protected abstract void doOnSuccess(V response);
}
Il modello può essere ripetuta per altri metodi nel tipo Receiver
.