【发布时间】:2015-10-02 05:37:15
【问题描述】:
假设我创建或拥有一个 node.js 库lib.js
export class C {
constructor(value, callback) {
callback(false, `Hello ${value}`);
}
task(value, callback) {
callback(false, "returned " + value);
}
}
重要的是类的构造函数需要像处理数据库连接和文件 I/O 一样接受回调。如果我现在导入并使用库回调样式,一切都很好(参见下面的c1)。
我真的很想向我使用它的库做出承诺,以使 对象构造 更方便(实际上它是一大堆类和方法)。
但是,我无法在承诺安全的情况下很好地找到new 类的方法。
import Promise from 'bluebird';
import * as lib from './lib';
Promise.promisifyAll(lib);
// old style -- works as expected
const c1 = new lib.C("c1", (e, v) => {
console.log(c1, e, v);
});
// assuming c1 got initialized, .task() also works
c1.task("t1", console.log);
c1.taskAsync("t2").then(() => console.log("also works"));
// But how to do this properly with promises?
const c2 = new lib.C("c2"); c2.then(console.log); // clearly doesn't work, lack of callback
const c3 = new lib.CAsync("c3"); c3.then(console.log); // "cannot read property apply of undefined"
const c4 = ???
我怎样才能做到最好?更改库签名不是一个好选择,创建工厂方法似乎也很难看。
【问题讨论】:
-
不要在构造函数中做 IO,将 io 和构造绑定在一起是个坏主意。
-
风格方面你可能是对的。但这不是节点 Redis 库和许多其他库(隐式)所做的吗?另外,我不是阻止什么的,只是触发动作。
-
@left4bread 在构造函数中执行 IO(甚至只是建立连接)往往会导致您在短时间内进入初始化循环。只需将 IO 工作拆分为一个方法 (
r = new Database(); r.openPool();) 即可使您的代码更简单、更可测试。
标签: javascript node.js constructor promise bluebird