Пусть я создал или есть Node.js библиотека lib.js
Promisify импортировали класс (конструктор) с Bluebird в ES6 + Бабель
export class C {
constructor(value, callback) {
callback(false, `Hello ${value}`);
}
task(value, callback) {
callback(false, "returned " + value);
}
}
Важной частью является то, что конструктор классов должен принять обратный вызов, как это делает подключения к базе данных и ввода/вывода файлов. Если я сейчас импортирую и использую обратный стиль библиотеки, все в порядке (см. 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 в конструкторах, что это плохая идея, чтобы связать Ио и строительство вместе. –
По-твоему, вы, вероятно, правы. Но разве это не то, что делают узловые библиотеки Redis и многие другие библиотеки (неявно)? Кроме того, это не то, что я блокирую или что-то еще, просто вызывая действия. – left4bread
@ left4bread Выполнение ввода-вывода (даже установление соединений) в вашем конструкторе, как правило, приводит вас к циклам инициализатора в короткие сроки. Просто разделение работы ввода-вывода на метод ('r = new Database(); r.openPool();') может сделать ваш код намного проще и более проверяемым. – ssube