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_
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:
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.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?
Lo fue, consulte https://caolan.github.io/async/v3/docs.html#QueueObject : pushAsync
Comentario más útil
Me gusta la idea
asyncPush
.