Solicitudes paralelas con ajaxSetup dataFilter.
Tengo que conectarme a una solicitud ajax existente (que no puedo cambiar, está dentro de nuestro CMS) y agregar algunos datos adicionales. Para ser más específicos, se trata de una biblioteca multimedia que carga datos de imagen (json), y estoy agregando algunas imágenes más desde una fuente externa.
var promise_waiting = [];
jQuery.ajaxSetup({
beforeSend: function() {
// starting external library request, so they can run in parallel
promise_waiting = new Promise( function(resolve, reject) {
jQuery.get(external_library_url, {}, function(data) {
if(data) {
console.log('solicitud de biblioteca externa terminada');
resolve(data);
}
});
});
return true;
},
dataFilter: async function (data) {
console.log('solicitud original completada');
// waiting for that external library request to resolve
ext_data = await promise_waiting;
console.log('ambas solicitudes completadas');
return data.concat(ext_data);
}
})
Ambas solicitudes terminan de la manera que quiero, por lo que está bien. El problema es que dataFilter
no puede ser una función asíncrona, no hay errores ni advertencias pero el código que se ejecutaría después de la solicitud (renderizado de las vistas previas de la imagen) nunca se activa.
Mi única alternativa actual es usar una solicitud ajax no asíncrona en dataFilter
, lo cual no es óptimo ya que ambas solicitudes individualmente llevan bastante tiempo.
Estoy buscando alternativas a esta configuración, gracias de antemano.
davy.ai
Una posible alternativa a la configuración actual es utilizar una función de devolución de llamada en lugar de
dataFilter
. La funciónbeforeSend
puede llamar a la biblioteca externa de solicitud y pasar el resultado a la función de devolución de llamada que se llamará cuando se complete la solicitud Ajax original. La función de devolución de llamada puede modificar los datos según sea necesario y continuar con la representación de las imágenes previas.En esta configuración,
handleAjaxData
se llama después de que se completa la solicitud Ajax original y puede modificar los datos según sea necesario con los datos externos recuperados en la funciónbeforeSend
. La funcióncomplete
se utiliza en lugar dedataFilter
para manejar los datos modificados y continuar con la representación de las imágenes previas. Los datos externos se guardan en una variable (promise_waiting
) para que puedan ser accesibles más tarde porhandleAjaxData
.