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);
_Originally发表@darksabrefr在https://github.com/caolan/async/pull/1641#issuecomment -498191809_
我正在考虑使用错误对象使q.push()
解析。 这样就足够了吗? 我真的不想把unhandledRejection
给绝大多数queue
用户。
解决错误可能是一种选择,但您需要测试q.push
返回值,它并不是真正的承诺常规模式(没有try
/ catch
/ finally
块或.then()
/ .catch()
方法可以使用)。 直接拒绝不是一种选择,我同意,这是一个重大修改。 对我来说,还有另外两种可能性:
q.asyncPush
方法,它返回一个可以拒绝的承诺。 也许是最简单、最清晰的方法,因为 promise 和回调 API 可以完全分离。q.push
第二个参数来激活承诺拒绝。真正重要的是承诺不会永远悬而未决,因此您可以选择您认为的最佳选项;-)
我喜欢asyncPush
想法。
非常感谢你 !
@aearly这曾经实施过吗?
是的,见https://caolan.github.io/async/v3/docs.html#QueueObject : pushAsync
最有用的评论
我喜欢
asyncPush
想法。