打字稿和承诺

时间:2015-09-01 19:24:34

标签: typescript

我刚刚开始使用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();
}

2 个答案:

答案 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));
    }
}