2015-12-12 116 views
7

我正在學習angular和Typescript。如何實現Typescript異步等待模式:Promise

我在這個服務中有一個CustomerService我有一個方法,我希望從RESTfull服務返回一個客戶數組。

起初我創造了我GetCustomers的功能這樣的:

public GetCustomers(): Dtos.ICustomer[] { 

     var _customers: Dtos.ICustomer[]; 
     this._httpService.get('http://localhost/myTestApi/api/customers/') 
      .success(function (data) { 

       _customers = data as Dtos.ICustomer[]; 
      }).error(function (error) { 
       console.log(error); 
      }); 
     return _customers; 
    } 

此功能,最終得到客戶,但顯然的HTTPService實際上得到的數據之前,將返回_customers。

在這一點上,我想我可以使用Typscript異步/等待,這是當我結束了一團糟。

我想寫我的功能是這樣的:

public async GetCustomers(): Dtos.ICustomer[] { 

     var _customers: Dtos.ICustomer[]; 
     await this._httpService.get('http://localhost/myTestApi/api/customers/') 
      .success(function (data) { 

       _customers = data as Dtos.ICustomer[]; 
      }).error(function (error) { 
       console.log(error); 
      }); 
     return _customers; 
    } 

我立即得到這個錯誤:錯誤TS1055類型「Dtos.ICustomer []」不是有效的異步函數的返回類型。

我發現這個Async/Await , simple example (typescript)

但是它使用的是無極對象:返回新承諾

如果我試圖由此重新寫我GetCustomers的方法簽名:

public async GetCustomers(): Promise<Dtos.ICustomer[]> {} 

我得到的和錯誤:

找不到名字'Promise'

我需要導入一些東西來獲得承諾嗎?

+0

可能重複[Async/Await,簡單示例(typescript)](http://stackoverflow.com/questions/32401741/async-await-simple-example-typescript) –

+0

是的,我看到了,但在我的結束Promise不存在? Typescript似乎對Promise一無所知。 如果我改變我的方法簽名公共異步GetCustomers的():無極 {...} 我得到一個錯誤說「無法找到名爲‘無極’) – John

+0

嗯,這肯定不會讓你的問題不同從鏈接之一,請編輯包含此信息。 –

回答

1

我會建議看角$ Q無極對象: https://docs.angularjs.org/api/ng/service/ $ Q

它處理你所需要的承諾。

public getCustomers(): ng.IPromise<Dtos.ICustomer[]> { 
     var lDefer: ng.IDeferred<Dtos.ICustomer[]> = 
      this.$q.defer<Dtos.ICustomer[]>(); 

     this._httpService.get('http://localhost/myTestApi/api/customers/') 
      .then((inResult: any) => { 
       let lResultList: Dtos.ICustomer[] = inResult.data; 
       lDefer.resolve(lResultList); 
      }, 
      (inError: any) => { 
       lDefer.reject(inError); 
      }); 

     return lDefer.promise; 
    } 

確保注入$ Q對象在你的控制器:

import IPromise = angular.IPromise; 
import IDeferred = angular.IDeferred; 

static $inject = ['$q', ...]; 

constructor(protected $q:angular.IQService, ...) { 
    super($q); 
} 

附: - 可從絕對鍵入的打字文件:http://definitelytyped.org/

您可以安裝通過TSD(現在已過時)或typings

0
tsconfig.json文件

compilerOptions下 'Q' 打字稿定義:

您需要添加:

"lib": ["dom", "dom.iterable", "scripthost","es2015.promise", "es2015"]

我使用es2015目標,但lib也存在於其他目標中。 在vscode中,你會有智能感知。