gpt4 book ai didi

javascript - 在 ES6 + babel 中使用 bluebird promise 导入类(构造函数)

转载 作者:数据小太阳 更新时间:2023-10-29 05:18:36 29 4
gpt4 key购买 nike

假设我创建了一个 node.js 库 lib.js

export class C {
constructor(value, callback) {
callback(false, `Hello ${value}`);
}

task(value, callback) {
callback(false, "returned " + value);
}
}

重要的部分是类的构造函数需要接受回调,因为它处理数据库连接和文件 I/O。如果我现在导入并使用库回调样式,一切都很好(请参阅下面的 c1)。

我真的很想 promise 我使用它的库,使对象构造更方便(实际上它是一大堆类和方法)。

但是,我找不到在 promise-safe 中正确地 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 和构造绑定(bind)在一起是个坏主意。

也就是说,如果您必须这样做是因为库不在您的控制范围内并且可以接受失去以同步方式构建对象的能力,您可以:

export class C {
constructor(value, callback) {
callback(false, `Hello ${value}`);
}

task(value, callback) {
callback(false, "returned " + value);
}
}

当 promise 时:

import Promise from 'bluebird';
import * as lib from './lib';


Promise.promisifyAll(lib);

var old = lib.C; // reference the constructor
lib.C = function(value){ // override it
o; // object we'll later return, populate in promise constructor
var p = new Promise(function(resolve, reject){
// the promise constructor is always sync, so the following works
o = new old(value, function(err, data) {
if(err) return reject(err);
resolve(data);
});
});
// THIS IS THE IMPORTANT PART
o.then = p.then.bind(p); // make the object a thenable,
return o
};

这会让你同时使用返回值和 promise , promise 将只有一个 then 所以你可能想要 Promise.resolve 它以获得一个“真正的” promise ,而不是具有属性 promise 的对象。

var o = new lib.C(); // get object
o.then(function(data){
// access data
});

这可以提取为一个模式:

 function promisifyConstructor(cons){
return function(...args) => { // new constructor function
let o;
let p = new Promise((resolve, reject) => {
// delegate arguments
o = new cons(...args, (err, data) => err ? reject(err) : resolve(data));
});
o.then = p.then.bind(p);
return o;
}
}

关于javascript - 在 ES6 + babel 中使用 bluebird promise 导入类(构造函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31392123/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com