【发布时间】:2016-05-11 12:18:57
【问题描述】:
我有一个接受回调的 Worker 类,但我想通过将其设置为 Promise 来删除回调,所以我可以这样做 new Worker(stuff, otherStuff).then(function() { ... });
为此,我使用了extends 关键字。
起初,我在this.a = a; 分配时收到ReferenceError: this is not defined 错误,但我发现那是因为我必须调用super();
现在,它在this.resolve({output: 'ok'}); 行给出了TypeError: this.resolve is not a function,所以我尝试强制添加this.resolve 和this.reject 函数,但错误不会消失。
这是(高度简化的)代码:
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');
});
我正在使用节点 6.1.0,其中 appears 支持 Promise 子类化...我做错了什么?
【问题讨论】:
-
实际上应该抛出的是
this.resolve = resolve;- 因为this在super调用返回之前尚未初始化 -
你能告诉我们你的实际代码吗?我不明白你为什么在这里继承
Promise或者到底什么部分是异步的。 -
实际代码使用了一个库(kue),它实现了一个异步队列,并用它来处理一些“测试”。处理完毕,调用this.resolve,如果某处有错误,调用this.reject
-
这似乎不是继承
Promise的好理由。只需创建一个返回标准承诺的普通函数。 -
实际代码可以在here找到,但请记住
BatchEvaluator类仍然是旧版本(带有回调)
标签: javascript node.js es6-promise