Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展JavaScript承诺时出错_Javascript_Node.js_Es6 Promise - Fatal编程技术网

扩展JavaScript承诺时出错

扩展JavaScript承诺时出错,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我有一个Worker类,它接受回调,但我想通过使回调成为Promise来删除回调,这样我就可以做新的Worker(stuff,otherStuff) 为此,我使用了extends关键字 首先,我得到了ReferenceError:在this.a=a处没有定义错误赋值,但我发现那是因为我必须调用super() 现在,它给出了TypeError:this.resolve不是this.resolve({output:'ok'})上的函数行,因此我尝试强制添加此项。解决和此项。拒绝函数,但错误不会消失

我有一个
Worker
类,它接受回调,但我想通过使回调成为
Promise
来删除回调,这样我就可以做
新的Worker(stuff,otherStuff)

为此,我使用了
extends
关键字

首先,我得到了
ReferenceError:在
this.a=a处没有定义
错误赋值,但我发现那是因为我必须调用
super()

现在,它给出了
TypeError:this.resolve不是
this.resolve({output:'ok'})上的函数
行,因此我尝试强制添加
此项。解决
此项。拒绝
函数,但错误不会消失

这是(高度简化的)代码:


我正在使用节点6.1.0,它支持
Promise
子类化。。。我做错了什么?

最佳做法是避免扩展原始类,因为它们会发生更改。扩展它们会将您自己的类放到浏览器/引擎中

当您尝试扩展Promise类时,
这个
将不会在构造函数中定义,因为现在大多数引擎都不支持子类Promise

此外,工人不是承诺。工人应该工作并做出承诺

解决方案是使用包装器或工厂模式,而不是继承


例如,您可以在
Worker
类中定义一个getter
promise
,它将创建一个新的
promise
实例并返回它。

实际上它是
this.resolve=resolve应该抛出-因为
super
调用返回之前,此
尚未初始化。请显示您的实际代码?我不明白为什么要在这里子类化
Promise
,或者到底什么部分是异步的。实际的代码使用一个实现异步队列的库(kue),并使用它来处理许多“测试”。处理完成后,它会调用this.resolve,如果某个地方出现错误,它会调用this.rejects。这似乎不是创建子类
Promise
的好理由。只需创建一个返回标准承诺的普通函数。可以找到实际的代码,但请记住,
BatchEvaluator
类仍然是旧版本(带有回调),删除前两段,您将得到一个升级投票:-)本机类被设计为可扩展的,这方面的规则是很明确的。@Bergi我不是为了投票而发帖的。此外,由于本机类和任何本机代码、对象等都不是由用户自己编写的,因此它们取决于提供者——比如编写javascript/typescript引擎的提供者。不管人们如何声称这样的类是设计成可扩展的blablablabla,人类本质上是不可信任的。我通过一种艰难的方式学会了这一点,所以不要试图说别的。所有的JS代码都由引擎实现者和执行者支配。本机类在ECMAScript语言规范中定义良好,没有理由不相信它。如果不使用任何内置项,就无法编写有用的JS代码,因此没有理由相信类的可扩展性低于正则表达式对象的
exec
方法。@Bergi Jul 3规范是参考,而不是实现。大多数情况下,规范远远领先于实际实现。因此,制造了多填料。这些实现将遵循或不遵循规范,具体取决于引擎限制。因此,即使Polyfill完成了他们的工作,但这并不意味着他们完全符合规范。我学到了不信任任何文档的艰难方法。
class Worker extends Promise {
    constructor(a, b) {
        super((resolve, reject) => {
            console.log('inside super');
            this.resolve = resolve;
            this.reject = reject;
        });

        console.log('start constructing');

        this.a = a;
        this.b = b;

        console.log('A: ' + JSON.stringify(a));
        console.log('B: ' + JSON.stringify(b));

        this.doStuff();

        if (!this.status) {
            this.resolve({output: 'ok'});
        } else {
            this.reject('There was an error');
        }
    }

    doStuff() {}
}

let a = {x: 1};
let b = {z: 2};

console.log('before creation');
let w = new Worker(a, b);
console.log('after creation');
w.then(function() {
    console.log('done');
});