Quanto sono sicure le richieste nascoste di AJAX per prestazioni fasulle?


48

Che cos'è una richiesta AJAX nascosta?

Ho notato un aumento dell'utilizzo delle richieste AJAX nascoste progettate per far sembrare che l'azione dell'utente si verifichi immediatamente. Farò riferimento a questo tipo di richiesta AJAX come non bloccante. È una richiesta AJAX fatta senza che l'utente sia consapevole del fatto che sta accadendo, viene eseguita in background e il suo funzionamento è silenzioso ( non vi è alcun dettaglio per indicare un completamento riuscito della chiamata AJAX ). L'obiettivo è far sembrare che l'operazione sia avvenuta immediatamente quando non è ancora terminata.

Ecco alcuni esempi di richiesta AJAX non bloccante;

  • I clic dell'utente vengono eliminati in una raccolta di e-mail. Gli oggetti scompaiono immediatamente dalla loro casella di posta e possono continuare con altre operazioni. Nel frattempo, una richiesta AJAX sta elaborando la cancellazione degli elementi in background.
  • L'utente compila un modulo per i nuovi record. Clic salva. Il nuovo elemento appare immediatamente nell'elenco. L'utente può continuare ad aggiungere nuovi record.

Per chiarire, ecco alcuni esempi di blocco della richiesta AJAX;

  • I clic dell'utente vengono eliminati in una raccolta di e-mail. Viene visualizzato un cursore a clessidra. Viene effettuata la richiesta AJAX e quando risponde il cursore a clessidra viene disattivato. L'utente deve attendere un secondo per il completamento dell'operazione.
  • L'utente compila un modulo per i nuovi record. Clic salva. Il modulo diventa grigio con l'animazione di un caricatore AJAX. Viene visualizzato un messaggio "I tuoi dati sono stati salvati" e il nuovo record viene visualizzato nell'elenco.

La differenza tra i due scenari precedenti è che una configurazione AJAX non bloccante non fornisce il feedback di una prestazione operativa e una configurazione AJAX bloccante.

Il rischio di richieste nascoste AJAX

Il rischio maggiore di questo stile di richiesta AJAX è che l'applicazione Web potrebbe trovarsi in uno stato completamente diverso quando la richiesta AJAX fallisce.

Ad esempio, un esempio non bloccante;

  • L'utente seleziona un gruppo di e-mail. Fai clic sul pulsante Elimina. L'operazione sembra avvenire immediatamente (gli elementi scompaiono dall'elenco). L'utente quindi fa clic sul pulsante Scrivi e inizia a digitare una nuova e-mail. È in questo momento che il codice JavaScript rileva la richiesta AJAX non riuscita. Lo script potrebbe mostrare un messaggio di errore, ma al momento è davvero inutile.

In alternativa, un esempio di blocco;

  • L'utente seleziona un gruppo di e-mail. Fai clic sul pulsante Elimina. Vede una clessidra, ma l'operazione non riesce. Ricevono un messaggio di errore che dice "errore. Blah blah blah". Vengono restituiti all'elenco di e-mail e hanno ancora le e-mail che volevano eliminare selezionate. Potrebbero tentare di eliminarli di nuovo.

Esistono anche altri rischi tecnici per l'esecuzione di richieste AJAX non bloccanti. L'utente potrebbe chiudere il browser, navigare su un altro sito Web e accedere a un'altra posizione nel Web corrente che rende insignificante il contesto di qualsiasi risposta di errore.

Allora perché sta diventando così popolare?

Facebook, Google, Microsoft, ecc. Ecc. Tutti questi grandi domini utilizzano sempre più richieste AJAX non bloccanti per far sembrare che le operazioni vengano eseguite all'istante. Ho anche visto un aumento degli editor di moduli che non hanno pulsanti di salvataggio o invio . Non appena lasci un campo o premi invio. Il valore è salvato Non è presente il tuo profilo è stato aggiornato il messaggio o il passaggio di salvataggio.

Le richieste AJAX non sono una certezza e non dovrebbero essere trattate come riuscite fino a quando non sono state completate, ma così tante applicazioni Web importanti funzionano in questo modo.

Questi siti Web che utilizzano chiamate AJAX non bloccanti per simulare applicazioni reattive corrono un rischio non necessario a costo di apparire velocemente?

È questo un modello progettuale che tutti dovremmo seguire per rimanere competitivi?


20
Ciò è giustificato dal fatto che un'operazione di successo è molto più probabile, quindi essere lenti solo per evitare il raro caso di feedback troppo ottimisti è un cattivo compromesso. Trasposto a relazioni personali, preferiresti interagire con una persona calma, solare o con una persona che presume categoricamente che tutto ciò che può andare storto andrà storto e agisce di conseguenza?
Kilian Foth,

1
Per me, quello con cui sto lottando è che un'applicazione desktop ha sia l'operazione che l'errore si verificano immediatamente. Dove come, con le applicazioni web l'operazione avviene immediatamente, ma l'errore è ritardato. Tuttavia, i siti funzionano con la progettazione di un'applicazione desktop.
Reactgular

7
Hai anche considerato cosa succede quando l'applicazione desktop scrive su disco, in realtà va in un buffer del sistema operativo e il disco si guasta prima che possa essere scritto sul piatto? In alternativa, il disco si guasta dopo che i byte sono stati scritti sul piatto. In entrambi i casi, l'utente pensa che qualcosa sia successo quando in realtà non è successo.
kdgregory,

2
@KilianFoth Preferirei colui che presume che tutto possa andare storto, se la persona "solare" ti punterà e ruberà il tuo portafoglio al primo segno di problemi. Quindi dipende dalla scala della reazione della pagina al fallimento.
Izkata,

1
@ButtleButkus Penso che quei messaggi di salvataggio siano nuovi. Non c'erano quando ho posto la domanda. Ho notato che Google ha aggiunto più feedback ultimamente, sta facendo cose in background.
Reactgular,

Risposte:


62

Non è tanto una prestazione "falsa" quanto una reattività reale. Ci sono una serie di motivi per cui è popolare:

  • Le connessioni Internet sono abbastanza affidabili al giorno d'oggi. Il rischio di fallimento di una richiesta AJAX è molto basso.
  • Le operazioni eseguite non sono realmente critiche per la sicurezza. Se le tue e-mail non vengono eliminate sul server, la cosa peggiore è che devi eliminarle di nuovo la prossima volta che verrai sulla pagina.
  • Puoi progettare la tua pagina per annullare l'azione se la richiesta fallisce, ma non devi essere così sottile perché significa che la tua connessione al server è interrotta. È più facile dire "Connessione persa. Impossibile salvare le modifiche recenti. Riprovare più tardi."
  • Puoi progettare la tua pagina in modo da consentire solo una richiesta AJAX in sospeso, in modo che il tuo stato non venga fuori sincronizzato dal server.
  • Il browser ti avvisa se provi a chiudere o ad allontanarti da una pagina mentre è in sospeso una richiesta AJAX.

AJAX in attesa di avviso


8
L'ultimo punto, tutti i browser lo fanno per impostazione predefinita?
Svish

Non lo so. L'ho provato solo su IE9 e l'ultimo Chrome.
Karl Bielefeldt,

3
Ovviamente non hai familiarità con Internet australiano, per non parlare di luoghi poveri, in via di sviluppo e isolati, persino mobili su un veicolo in movimento ...
hippietrail

2
@hippietrail Beh, non puoi rendere tutti felici per tutto il tempo.
KOVIKO

1
Quando l'utente invia una richiesta, non sempre chiede una nuova pagina. Penso che le applicazioni AJAX ben progettate possano renderle più divertenti, facendo sapere all'utente cosa sta succedendo in modo più efficiente rispetto a una ricarica.
Frederik.L,

32

Supponendo che qualcosa funzionerà e che visualizzi un errore nel caso in cui si verifichi un errore sul lato remoto è molto più user-friendly che impedire all'utente di fare qualsiasi altra cosa fino a quando non c'è una risposta dal server.

Un client di posta elettronica è in realtà un ottimo esempio per questo: quando ho un elenco con 5 e-mail e viene selezionata la prima, mi aspetto che quando si colpisce DELtre volte le prime tre e-mail vengono eliminate. Con "AJAX non bloccante" funziona perfettamente: ogni volta che premo il tasto l'e-mail selezionata viene rimossa immediatamente. Se qualcosa va storto, viene visualizzato un errore e vengono nuovamente visualizzate le e-mail non correttamente cancellate OPPURE la pagina viene ricaricata per eliminare lo stato locale incoerente.

Quindi, nel caso più comune - questo è successo - migliora l'usabilità. Nel raro caso - fallimento - l'usabilità è degradata (l'elemento cancellato appare di nuovo o l'applicazione viene "riavviata") ma quando si crea un'applicazione di solito si desidera avere la migliore usabilità per casi comuni, non in caso di errori.


1
+1 questo è il punto centrale della questione. C'è così tanta sicurezza per impostazione predefinita che le persone implementano in questi giorni che nei casi peggiori non stai ancora rischiando i veri errori dell'utente: immagina che il client di posta elettronica non riesca a eliminare, ora lo stato locale è cattivo e prova a eliminare l'e-mail 4 che non è allineata con il server, la stragrande maggioranza degli sviluppatori di back-end avrà un fermo di sicurezza lì per assicurarti di eliminare solo ciò che l'utente vuole assolutamente e quindi questo disallineamento non causerà cancellazioni errate (potrebbe non riuscire per errore ma non cancellerà) .
Jimmy Hoffa,

@JimmyHoffa useresti un ID email univoco nella richiesta di cancellazione. Sarebbe davvero male inviare richieste di eliminazione in base all'ordine di visualizzazione arbitrario delle e-mail nella posta in arrivo.
Buttle Butkus,

14

Agli utenti non importa cosa sta facendo il tuo software dietro le quinte: vogliono che le loro azioni abbiano un impatto visibile e siano in grado di lavorare al loro ritmo.

Se un'azione ha avuto esito positivo sul lato client, ad esempio l'eliminazione di e-mail, è compito tuo riuscire anche sul lato server. Perché la cancellazione non è riuscita? Se è a causa di un qualche tipo di limitazione (ad esempio, non è possibile rimuovere un messaggio di posta elettronica che è stato archiviato), l'utente dovrebbe esserne informato prima che la sua azione fallisse.

Se l'errore è causato da qualcosa di più grave (diciamo un arresto anomalo del database), dovresti avere un modo per salvare l'operazione e riprovare quando il sistema è di nuovo attivo.

Un buon esempio di gestione di questo è il modo in cui Facebook gestisce la chat. Non c'è modo di impedire a un utente di disconnettersi improvvisamente, il che significa che non saranno in grado di leggere i messaggi inviati prima di partire. Invece di visualizzare un errore, il sistema salva tutti quei messaggi e li rende disponibili all'utente al suo ritorno. Nessun dato è perso.


2
+1. Eccellente esempio di chat. La maggior parte degli utenti si aspetta che il loro messaggio sia reso immediatamente disponibile a tutti e poiché tali messaggi raramente falliscono, agli utenti viene data l'illusione che sia così.
Neil,

1
@Niphra, "Perché la cancellazione non è riuscita?" La rete può fallire per molte ragioni, nessuna delle quali riguarda l'applicazione. Non c'è niente che tu possa fare per fermarlo.
Pacerier,

5

Puoi scendere a compromessi tra le due opzioni. Ad esempio, se l'utente elimina un messaggio di posta elettronica, è possibile contrassegnarlo in rosso o grigio fino a quando non si ottiene una conferma dal server e solo successivamente rimuoverlo dall'elenco. L'utente può ancora fare altre cose mentre è in corso un'azione, quindi non si blocca, ma lascia comunque un piccolo promemoria per l'utente che le sue azioni non sono ancora state commesse.

Amazon AWS adotta questo approccio: quando interrompi / avvii un'istanza, la casella di controllo che ti consente di selezionarla si trasforma in uno spinner (quindi non puoi farci nulla per alcuni secondi), ma questo non ti impedisce di interagendo con altre istanze.


Il tuo suggerimento è simile a come Gmail mostra il testo "Salvataggio in corso ..." mentre l'XHR è in esecuzione e "Salvato" dopo che è stato completato. Se dicesse sempre "Salvato", chi ci crederebbe?
Buttle Butkus,

3

Penso che questo si unisca a un numero sempre maggiore di siti Web che provano a comportarsi come Applicazioni e fanno più elaborazioni nel browser (come la convalida dei dati dei moduli) rispetto ai siti più tradizionali. Non vedo troppi problemi in quanto il tuo codice è affidabile e puoi aspettarti che abbia successo in condizioni normali.

Dici "È in questo momento che il codice JavaScript scopre che la richiesta AJAX non è riuscita. Lo script potrebbe mostrare un messaggio di errore, ma al momento non ha senso."

Perché dovrebbe essere inutile? È possibile tornare indietro nell'elenco di e-mail ed eseguire nuovamente l'eliminazione. Perché aspettare invece? In realtà non esiste un "rischio" e non "sembrano" essere veloci, in realtà funzionano più velocemente. Quindi se l'attività non è "critica", perché essere lento?


1
Forse inutile non era la parola giusta, ma quello che voglio dire è che il messaggio di errore manca di contesto relativo, perché l'utente sta facendo qualcosa di completamente diverso. Sto cercando di dire, è che per un utente Web ignorante, hanno pensato che le e-mail fossero state eliminate correttamente. Quindi perché ora, in seguito, ricevono un messaggio di errore per qualcosa che "vedono" sono stati rimossi. Per noi programmatori, capiamo, ma per il nonno che usa Gmail non capiranno.
Reactgular

La maggior parte delle persone preferisce utilizzare un'applicazione in cui le cose accadono immediatamente, il sistema è reattivo e c'è una possibilità su 10.000 che l'interfaccia utente possa aggiornare in modo strano su un errore rispetto a un'applicazione che si blocca per un secondo ogni volta che cambiano un valore.
Gort the Robot

1

Il mio 2c è: ci sono situazioni in cui è meglio avere, come dici tu, operazioni Ajax "non bloccanti" e altre in cui è una cattiva scelta progettuale. Esempio: votazione di un video di YouTube. Non vuoi davvero che nessuna parte della pagina venga bloccata mentre fai clic sul piccolo inizia lì. È meglio fallire silenziosamente. Anche un messaggio di conferma verrebbe ucciso. Tuttavia, il tuo esempio con l'eliminazione dell'email mi qualificherebbe come obbligatorio per la richiesta Ajax di tipo bloccante.

Mongo DB fa qualcosa del genere (e questo potrebbe essere considerato come un esempio di applicazione desktop). Hanno varie "preoccupazioni di scrittura" per le loro operazioni e puoi configurarlo su valori diversi per ogni operazione, che vanno da "torna subito e non aspettare nulla" a "bloccare fino a quando non avrai la conferma del corretto trasferimento di rete e quindi ritorna "a" attendi che il contenuto sia correttamente programmato per la scrittura su disco sul computer remoto prima del tuo ritorno ". Ovviamente, se crei un client spesso desktop (come in C ++) usando il driver Mongo, imposteresti la più leggera preoccupazione di scrittura per operazioni db di minima "criticità" (come il controllo di nuove e-mail), e altre su preoccupazioni di scrittura più rigide .

Mentre vedo l'utilità di Ajax non bloccante, sono d'accordo con te sul fatto che sta accadendo troppo. Ad un certo punto c'era almeno un famoso sito di "social network" che lo avrebbe fatto per il caricamento di foto. Hai scelto la tua foto da caricare e poi bam, subito ti direbbe che è stato fatto, e quindi abbastanza sicuro il giorno successivo quando volevi aggiungere qualche altra foto (o usarla su quello che pensavi di aver già aggiunto), non è mai stato trovato. Più tardi hanno rinunciato a questo, e in realtà si sono presi il tempo di aspettare la risposta (e in effetti a volte si ricevevano messaggi come "impossibile caricare foto, provare più tardi").


+1 per vedere le cose a modo mio :). Il caricamento della foto ne è un ottimo esempio.
Reactgular

1
Perché sarebbe preferibile un caricamento di blocco? In Picasa (interfaccia web), puoi trascinare le foto e, mentre si caricano in background, puoi trascinarne altre o taggare le foto che sono finite, ecc. Un'operazione di caricamento bloccata renderebbe un UX orribile
BLSully
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.