我刚刚开始使用typescript 1.5和promises(目前使用来自Jake Archibald的es6-promise): 一些类,一个类实例化详细信息类,它实例化公共类,但我需要在详细信息类进行调用之前完成公共类。根据我的理解,承诺是实现这一目标的关键......但是如何在类中获得承诺并且不仅仅是类方法。试图避免jQuery的承诺,因为从我读过的,他们并没有完全遵循promises / a + ...
some pseudo-code:
export class UserData extends Promise<UserData> (?){
_cd = new CommonData();
*another ajax call, based on data returned obtained commondata call*
}
export class CommonData {
private _instance = this;
public Name: string= null;
constructor () {
*I want to make my class promisable, not just the methods*
new promise(function (resolve, reject) {
??
});
}
getData() {
var parentClass = this._instance;
return new Promise(function(resolve, reject) {
$.ajax({
success: {
...
parentClass.Name = *data from ajax*;
resolve();
},
error: {
reject();
}
}
}
}
export class UI {
var us = new UserDetails();
}
答案 0 :(得分:3)
类UserData扩展了Promise(?){
没有。相反,想想组合:(不是继承..除非你正在写一个新的诺言库......这不是这里的情况)
class UserData {
public data;
constructor(){
doStuff().then(()=>this.data = new SomeData());
}
}
答案 1 :(得分:1)
如果异步初始化UserData,则创建一个返回Promise的工厂方法。在这种情况下,initUserData
是工厂方法,底层构造函数不应该在外部使用,尽管在TypeScript中它不能被设置为私有。
通常,作为反应式编程的指南,如果您决定使用Promises进行编程,则期望在同步编码的程序公开Promise<T>
的任何地方公开T
。并非总是如此,有时您必须阻止解决,但每个阻塞实例都有轻微的代码气味需要检查。
export class UserData {
constructor(commonData: CommonData) {
// Construct your UserData
}
initUserData(): Promise<UserData> {
Promise<CommonData> common = getCommonDataPromise();
return common.then(c => new UserData(c));
}
}