2016-08-08 66 views
0

我正在用TypeScript編寫Angular 1.x,並且我有一個負責加載數據的服務(DataService)。舉一個簡單的例子,它查詢一個節點並返回一個節點。在接口方面:如何在TypeScript中用承諾包裝返回類型?

getNode(id: number): ng.IPromise<Node>; 

和實現:

getNode(id: number) { 
      return this.ajaxService.getNode(id) 
       .then((result: ng.IHttpPromiseCallbackArg<Node>) => { 
        return new Node(result.data.ID, result.data.Name); 
       }); 
     } 

不過,我想向大家介紹的是存儲這些結果並返回他們,如果我之前已經查詢了他們另一個服務。所以像這樣:

getNode(id: number) { 
     var loadedNode = this.storageService.nodes.filter(e => (e.ID == id)); 
     if (loadedNode.length > 0) { 
      return loadedNode[0]; 
     } 

     return this.ajaxService.getNode(id) 
      .then((result: ng.IHttpPromiseCallbackArg<Node>) => { 
       var n = new Node(result.data.ID, result.data.Name); 
       this.storageService.nodes.push(n); 
       return n; 
      }); 
    } 

但是,返回類型失敗,因爲它期待'ng.IPromise',而不是'節點'。如何包裝'return loadedNode [0];'變成某種承諾返回類型而不是返回實際的對象?

回答

2

你可以像這樣做,使用$q-service

getNode(id: number) { 
    var deferred = this.$q.defer(); 

    var loadedNode = this.storageService.nodes.filter(e => (e.ID == id)); 
    if (loadedNode.length > 0) { 
     // immediately resolve with the cached node 
     deferred.resolve(loadedNode[0]); 
    } else { 
     // else load through service 
     this.ajaxService.getNode(id) 
      .then((result: ng.IHttpPromiseCallbackArg<Node>) => { 
       var n = new Node(result.data.ID, result.data.Name); 
       this.storageService.nodes.push(n); 

       // resolve with the loaded node 
       deferred.resolve(n); 
      }); 
    } 

    // return the promise to register callbacks 
    return deferred.promise; 
} 

用法:

myService.getNode(id).then((node) => { 
    // success 
},() => { 
    // error 
}); 
+0

是的,就是這樣!太棒了,謝謝你! – RamblerToning

+0

我是否必須更改界面中的返回類型?目前,它是 getNode(id:number):ng.IPromise ; 但TypeScript似乎沒有彈出它應該知道返回類型是一個節點的承諾。 這不會造成任何問題,但我試圖用另一種方法 getChildren(id:number):ng.IPromise ; TypeScript不知道承諾的返回類型是一個數組 – RamblerToning

+0

通過將方法本身的返回類型,而不僅僅是在接口上,解決了我自己的問題。 – RamblerToning

1

使用$ q.when(值,[successCallback],[errorCallback],[progressCallback] )

你可以改變

return $q.when(loadedNode[0]); 
返回線

更多信息在angular $q