es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo establecer una bandera desde una promesa que está contenida en un bucle, antes de ES8?

Lo que estoy tratando de lograr es enviar un montón de solicitudes POST a un servicio de impresión y, si alguna de ellas falla, quiero mostrar un mensaje de advertencia al usuario. Mi configuración actual tiene un mensaje de advertencia cada vez que falla.

items.forEach(function (item) {

    var data = {
        date: self.getDateTime(),
        barcode: item.barcode,
        description: item.description
    };
    var url = 'http://localhost/print_service';
    $.ajax({
        method: "POST",
        url: url,
        data: JSON.stringify(data),
    }).fail(function () {
        self.display_warning(
            'Failed to connect to printer',
        );
    });
});

No puedo utilizar async / await en este proyecto.

Mi idea era simplemente establecer una bandera como printFailed = true y después del bucle solo mostrar un mensaje si es verdadero. Sin embargo, el fail es por supuesto asincrónico, por lo que la bandera ahora está establecida cuando hago esa comprobación.

¿Cómo puedo abordar esto de manera efectiva? Normalmente lanzaría el error y / o la bandera en un .then(), pero no puedo hacer esto ya que luego seguiría atrapado en el bucle.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr enviar solicitudes de envío a un servicio de impresión y mostrar un mensaje de advertencia al usuario si alguna de ellas falla sin tener múltiples mensajes de advertencia, puedes usar una variable contador para llevar un registro del número de solicitudes fallidas.

    Por ejemplo:

    var numFailedPrints = 0;
    
    items.forEach(function (item) {
    
        var data = {
            date: self.getDateTime(),
            barcode: item.barcode,
            description: item.description
        };
        var url = 'http://localhost/print_service';
        $.ajax({
            method: "POST",
            url: url,
            data: JSON.stringify(data),
        }).fail(function () {
            numFailedPrints++;
        }).always(function () {
            if (numFailedPrints > 0) {
                self.display_warning(
                    'Error al conectar con la impresora para ' + numFailedPrints + ' artículo(s)',
                );
            }
        });
    });
    

    En este ejemplo, inicializamos numFailedPrints en 0 fuera del bucle, y luego lo incrementamos cada vez que una solicitud falla en la devolución de llamada fail.

    La devolución de llamada always se llama después de que cada solicitud se complete, ya sea exitosa o no. Dentro de esta devolución de llamada, verificamos si numFailedPrints es mayor que 0 y, si es así, mostramos el mensaje de advertencia con el número de impresiones fallidas.

    De esta manera, solo mostramos un mensaje de advertencia que resume el número de impresiones fallidas, en lugar de mostrar un mensaje de advertencia por cada solicitud fallida.

Comments are closed.