Async: Awaitable q.push не разрешается, когда работник очереди выдает ошибку

Созданный на 6 июн. 2019  ·  6Комментарии  ·  Источник: caolan/async

await q.push(task) пока небезопасно для использования, потому что обещание, возвращаемое q.push никогда не разрешается и не отклоняется, если работник очереди выдает ошибку. Я понимаю, что await q.push(task) не может выдать ошибку из-за обратной совместимости этого метода и его необязательного параметра обратного вызова (функция "нажать и забыть"). Метод q.asyncPush(task) который отклоняет свое обещание, не может быть осуществим?

Вы можете показать проблему с помощью этого кода (в узле или браузере без требования):

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

_Изначально опубликовано @darksabrefr в https://github.com/caolan/async/pull/1641#issuecomment -498191809_

bug feedback-wanted

Самый полезный комментарий

Мне нравится идея asyncPush .

Все 6 Комментарий

Я рассматриваю возможность разрешения q.push() с помощью объекта ошибки. Этого будет достаточно? Я действительно не хочу давать unhandledRejection подавляющему большинству пользователей queue .

Устранение ошибки может быть вариантом, но вам нужно будет проверить возврат q.push , это не совсем обычный шаблон обещания (нет try / catch / finally block или .then() / .catch() методы могут использоваться с). Прямой отказ - это не вариант, я согласен с этим, это серьезная модификация. Для меня есть еще 2 возможности:

  • отдельный метод q.asyncPush который возвращает обещание, которое можно отклонить. Возможно, это самый простой и понятный способ, потому что API-интерфейсы обещания и обратного вызова могут быть полностью разделены.
  • логическое значение в качестве второго параметра q.push для активации отклоненных обещаний.

На самом деле важно то, что обещания не будут вечными, поэтому вы можете выбрать лучший вариант, который вы думаете ;-)

Мне нравится идея asyncPush .

Большое спасибо !

@ когда-нибудь это было реализовано?

Это было, см. Https://caolan.github.io/async/v3/docs.html#QueueObject : pushAsync

Была ли эта страница полезной?
0 / 5 - 0 рейтинги