Async: O q.push aguardável não resolve quando o trabalhador da fila lança um erro

Criado em 6 jun. 2019  ·  6Comentários  ·  Fonte: caolan/async

await q.push(task) não é seguro para uso no momento porque a promessa retornada por q.push nunca resolve nem rejeita se o operador de fila lançar um erro. Eu entendo que await q.push(task) não pode lançar um erro por causa da compatibilidade com versões anteriores desse método e seu parâmetro de retorno de chamada opcional (o recurso push and forget). Um método q.asyncPush(task) que rejeita sua promessa não deveria ser viável?

Você pode mostrar o problema com este código (no nó ou navegador sem a necessidade):

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);

_Originalmente postado por @darksabrefr em https://github.com/caolan/async/pull/1641#issuecomment -498191809_

bug feedback-wanted

Comentários muito úteis

Gosto da ideia asyncPush .

Todos 6 comentários

Estou pensando em fazer q.push() resolver com o objeto de erro. Isso seria suficiente? Eu realmente não quero dar unhandledRejection s para a grande maioria dos queue usuários.

Resolver com um erro pode ser uma opção, mas você precisará testar o retorno de q.push , não é realmente um padrão convencional de promessa (não try / catch / finally block ou .then() / .catch() métodos podem ser usados ​​com). Rejeições diretas não são uma opção, concordo com isso, é uma modificação importante. Para mim, existem 2 outras possibilidades:

  • um método q.asyncPush distinto que retorna uma promessa que pode ser rejeitada. Talvez a maneira mais fácil e clara, porque as APIs de promessa e retorno de chamada podem ser totalmente separadas.
  • um booleano como segundo parâmetro de q.push para ativar promessas rejeitadas.

O que é realmente importante é que as promessas não ficarão para sempre pendentes, então você pode selecionar a melhor opção que achar ;-)

Gosto da ideia asyncPush .

Muito obrigado !

@aearly isso já foi implementado?

Esta página foi útil?
0 / 5 - 0 avaliações