Async: 当队列工作人员抛出错误时,Awaitable q.push 无法解决

创建于 2019-06-06  ·  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);

_Originally发表@darksabrefrhttps://github.com/caolan/async/pull/1641#issuecomment -498191809_

bug feedback-wanted

最有用的评论

我喜欢asyncPush想法。

所有6条评论

我正在考虑使用错误对象使q.push()解析。 这样就足够了吗? 我真的不想把unhandledRejection给绝大多数queue用户。

解决错误可能是一种选择,但您需要测试q.push返回值,它并不是真正的承诺常规模式(没有try / catch / finally块或.then() / .catch()方法可以使用)。 直接拒绝不是一种选择,我同意,这是一个重大修改。 对我来说,还有另外两种可能性:

  • 一个独特的q.asyncPush方法,它返回一个可以拒绝的承诺。 也许是最简单、最清晰的方法,因为 promise 和回调 API 可以完全分离。
  • 一个布尔值作为q.push第二个参数来激活承诺拒绝。

真正重要的是承诺不会永远悬而未决,因此您可以选择您认为的最佳选项;-)

我喜欢asyncPush想法。

非常感谢你 !

@aearly这曾经实施过吗?

此页面是否有帮助?
0 / 5 - 0 等级