Me estoy escribiendo mucho espagueti en Javascript cuando tengo que lidiar con aplicaciones asíncronas (especialmente cuando se trata de código OpenSocial donde se deben obtener todos los datos a través de JS) . El patrón habitual es algo así como:Cómo evitar el código de espagueti en Javascript
- El usuario inicia sesión en la aplicación por primera vez, obtiene sus datos.
- Haz una A con sus datos (por ejemplo, consigue a sus amigos enviando una solicitud al servidor).
- Haz B con estos datos (por ejemplo, envía a sus amigos al servidor para que realicen algún procesamiento).
- Haz C sobre sus datos (por ejemplo, comprueba que la respuesta del servidor sea válida para que podamos hacer otra cosa).
Tenga en cuenta que esta ruta de ejecución secuencial (1 => 2 => 3 => 4) no encaja bien con la asincrónica. naturaleza de Ajax por lo que el usuario termina esperando durante mucho tiempo y el código se convierte en un lío ya que cada paso depende de los anteriores.
Un ejemplo de código:
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();
}
Se puede ver que cada función depende de la anterior, y lo que es peor, tiene que ser llamado en un orden específico para ser útil. Se pone peor cuando tiene que agregar cosas como mostrar u ocultar las pantallas de carga y otros trucos mientras el usuario espera.
¿Cómo vas a arreglar esto?
Cocínelo hasta que esté al dente –
Su principal preocupación parece ser que el usuario termina esperando por mucho tiempo para que todo esto se complete.¿Por qué no proporcionar comentarios al usuario después de que cada solicitud se devuelva para que sepan que algo está sucediendo? Podría ser tan simple como una barra de progreso de 3 etapas o mensajes que le digan al usuario lo que está sucediendo. (Incluso podría lanzar un mensaje de "splines de reticulación" para meme apeal.) –
Sam: Estoy mostrando pantallas de carga en este momento con un lindo robot agitando sus brazos, pero el código también me preocupa porque sé que tendré algunos problemas para leerlo en un par de meses. –