¿Existe un patrón o una forma estándar de manejar las condiciones de carrera de Ajax? Toma el siguiente ejemplo. Tienes dos mesas. Al hacer clic en una fila de la tabla 1, se eliminan los datos de la base de datos y luego se actualiza la tabla 2 (que ahora mostraría todas las filas de la tabla 1 menos la fila en la que se hizo clic).
Si alguien hace clic en un montón de filas en una sucesión rápida, podría obtener un escenario en el que la tabla 2 no se actualiza para todos los clics que se hacen para problemas de tiempo / retraso.
¿Cuál podría ser una buena manera de abordar esto? Estaba pensando en usar una posible cola, pero ese tipo de derrota el propósito de hacerlo de forma asincrónica. Sin embargo, aún tendría el beneficio de que la interfaz de usuario no se bloquea.
fuente
Respuestas:
Solo un pensamiento, quizás podría crear una lista para sus métodos de devolución de llamada Ajax. Envolvería su devolución de llamada real de Ajax en un método que agrega esa devolución de llamada a una ranura en una lista.
Esta lista espera devoluciones de llamada en un orden específico y solo se ejecuta si se llena el elemento superior (la devolución de llamada que desea llamar primero).
fuente
Esta no es una condición de carrera.
Se produciría una condición de carrera cuando el comportamiento entre dos subprocesos asincrónicos se vuelve indefinido. Puede resolver este problema anidando la devolución de llamada desde la primera llamada
fuente
Promise.then()
para ejecutar devoluciones de llamada asíncronas en el orden correcto.En general, las devoluciones de llamada son una herramienta universal para tratar tareas asincrónicas y, de hecho, las devoluciones de llamada son el mecanismo para manejar las solicitudes AJAX en JavaScript. En el contexto de la devolución de llamada, incluso puede tener referencia a la fila en la que se hace clic (si está cerrada en el cierre). Puede encontrar útiles los siguientes artículos: jQuery diferido y Uso de diferidos en jQuery
Otra cosa que debe tener en cuenta, si el usuario puede hacer clic en varios botones, es que se iniciarán varias solicitudes. Sin embargo, diferentes navegadores pueden manejar diferentes cantidades de solicitudes AJAX simultáneamente: concurrent-ajax-xmlhttprequest-request . Para superar esto, debe implementar alguna cola de solicitud básica.
fuente