扩展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
类中定义一个getterpromise
,它将创建一个新的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');
});