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_
Я рассматриваю возможность разрешения 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
Самый полезный комментарий
Мне нравится идея
asyncPush
.