Async: El q.push esperado no se resuelve cuando el trabajador de la cola arroja un error

Creado en 6 jun. 2019  ·  6Comentarios  ·  Fuente: caolan/async

await q.push(task) no es seguro para su uso por el momento porque la promesa devuelta por q.push nunca se resuelve ni se rechaza si el trabajador de la cola arroja un error. Entiendo que await q.push(task) no puede arrojar un error debido a la compatibilidad con versiones anteriores de este método y su parámetro de devolución de llamada opcional (la función de empujar y olvidar). ¿Un método q.asyncPush(task) que rechaza su promesa no debería ser factible?

Puede mostrar el problema con este código (en el nodo o navegador sin el requisito):

const async = require('async');
let pushResult;

(async () => {
    const q = async.queue(async (task) => {
        throw new Error('Bad thing');
    });

    try {
        pushResult = q.push({some: 'data'});
        await pushResult;
        console.log('Error not catched');
    } catch (e) {
        console.log('Error catched');
    }
})();

setTimeout(() => {
    console.log('exit');
    console.log(pushResult);
}, 1000);

_Publicado originalmente por @darksabrefr en https://github.com/caolan/async/pull/1641#issuecomment -498191809_

bug feedback-wanted

Comentario más útil

Me gusta la idea asyncPush .

Todos 6 comentarios

Estoy considerando hacer q.push() resolver con el objeto de error. ¿Sería eso suficiente? Realmente no quiero dar unhandledRejection s a la gran mayoría de los usuarios de queue .

Resolver con un error puede ser una opción, pero deberá probar la devolución q.push , no es realmente un patrón convencional de promesa (no try / catch / finally block o .then() / .catch() se pueden usar con). Los rechazos directos no son una opción, estoy de acuerdo, es una modificación importante. Para mí, hay otras 2 posibilidades:

  • un método q.asyncPush distinto que devuelve una promesa que se puede rechazar. Quizás la forma más fácil y clara porque las API de promesa y devolución de llamada se pueden separar por completo.
  • un booleano como segundo parámetro de q.push para activar promesas rechazadas.

Lo realmente importante es que las promesas no estarán pendientes para siempre, así que puedes seleccionar la mejor opción que creas ;-)

Me gusta la idea asyncPush .

Muchas gracias !

@aearly ¿ se implementó esto alguna vez?

¿Fue útil esta página
0 / 5 - 0 calificaciones