Mi sto ritrovando a scrivere un sacco di spaghetti in Javascript quando ho a che fare con applicazioni asincrone (specialmente quando si tratta di codice OpenSocial dove tutti i dati devono essere ottenuti tramite JS) . Il solito schema è qualcosa del tipo:Come evitare il codice spaghetti in Javascript
- L'utente accede all'applicazione per la prima volta, ottiene i suoi dati.
- Fare A sui suoi dati (ad esempio, ottenere i suoi amici inviando una richiesta al server).
- Fare B su questi dati (ad esempio, inviare i propri amici al server per l'elaborazione).
- Fare C sui propri dati (ad esempio controllare che la risposta del server sia valida in modo che possiamo fare qualcos'altro).
Si noti che questo percorso di esecuzione sequenziale (1 => 2 => 3 => 4) non si adatta bene all'async. natura di Ajax quindi l'utente finisce per aspettare a lungo e il codice si trasforma in un casino dato che ogni passo dipende da quelli precedenti.
Un esempio con il codice:
gadgets.util.registerOnLoadHandler(setupUser())
...
function setupUser() {
var req = [get data and setup request]
req.send(some_url, some_data, function(response) { getFriendsFor(response.user) });
}
function getFriendsFor(user) {
var friends = [get friends from user]
var req = [setup request]
req.send(some_other_url, some_other_data, function(response { validateFriendsResponse(response.friends) });
}
function validateFriendsResponse(friends) {
if (friends.valid())
...
loadCanvas();
}
Si può vedere che ogni funzione dipende quella precedente, e quel che è peggio, deve essere chiamato in un ordine specifico per essere utile. Diventa peggio quando devi aggiungere elementi come mostrare/nascondere il caricamento degli schermi e altri espedienti mentre l'utente è in attesa.
Come procederesti a risolvere questo problema?
Cuocilo fino a quando non è al dente –
La tua preoccupazione principale sembra essere che l'utente finisce per aspettare molto tempo per completare tutto questo.Perché non fornire un feedback all'utente dopo che ciascuna richiesta viene restituita in modo che sappia che qualcosa sta accadendo. Potrebbe essere semplice come una barra di avanzamento a 3 fasi o messaggi che dicono all'utente cosa sta succedendo. (Potresti anche inserire un messaggio di "spionette reticolari" per meme apeal.) –
Sam: Sto mostrando gli schermi di caricamento in questo momento con un simpatico robot che agita le braccia, ma il codice mi preoccupa anche perché so che ne avrò un po ' problemi di leggerlo in un paio di mesi. –