我创建了一个小类,它包装了一个通用的回调函数签名,并返回一个promise。
然而它调用句柄 menthod _resolve 未定义。
/// <reference path="typings/es6-promise/es6-promise.d.ts" />
import rsvp = require('es6-promise');
var Promise = rsvp.Promise;
/** * wrapper a callback style call into a promise */ class
Promiseify<T> {
private _promise : Promise<T>;
private _resolve : (result?: T) => void;
private _reject : (error: any) => void;
/**
* create wrapper, example: new Promiseify(call).promise
* @param call example (handle) => yourDb.update(document, handle)
*/
constructor(call:(handle:(error: any, result: T) => void) => void){
this._promise = new Promise<T>((resolve, reject) =>{
this._resolve = resolve;
this._reject = reject;
call(this.handle);
});
}
handle(error: any, result: T) {
if(error != null) this._reject(error);
else this._resolve(result);
}
/**
* get the es6 promise which can then be passed to external callers
* @returns {Promise<T>} the es6 promise which this class creates.
*/
get promise() : Promise<T>{
return this._promise;
}
}
//the test rig
new Promiseify<string>((handle)=> {
handle(null, 'hello world');
}).promise.then((greeting: string)=> {
console.log(greeting);
});
我错过了什么,顺便说一句,封面上的JS看起来还不错
如果它有助于我在Node.JS上运行它,在Webstorm 9.03
中答案 0 :(得分:1)
您正在将this.handle
传递给call()
,因此当call()
调用它时,this
将为null
,这就是为什么您的方法不是{\ n}工作。
我不确定TypeScript中最惯用的是什么,但你可以这样做:
call(this.handle.bind(this));
或
call((error, result) => this.handle(error, result));
或者,您可以完全摆脱handle
方法,并执行此操作:
this._promise = new Promise<T>((resolve, reject) => {
call(function (error, result) {
if (error) { reject(error); }
resolve(result);
});
});
然后,这就留下了为什么你需要一个类的问题,当你可以使用一个8行函数做同样的事情时:
function promisify<T>(call:(handle:(error: any, result :T) => void) => void) {
return new Promise<T>((resolve, reject) => {
call(function (error, result) {
if (error) { reject(error); }
resolve(result);
});
});
}
答案 1 :(得分:1)
这里有两个选项:
第一个是将handle方法声明为如下属性:
handle = (error: any, result: T) => {
if(error != null) this._reject(error);
else this._resolve(result);
}
或者更改您的调用方法,以便在实例上调用它,如下所示:
var that = this;
call(function(e, r) { that.handle(e, r); });