2016-08-30 32 views
14

因此,我正在用打字稿學習Angular 2。如何使用TypeScript返回適當的承諾

我到達了寫一個嘲笑的服務(我相信)應該返回一個承諾,如果該服務獲得對象成功,並返回一個錯誤,如果任何事情發生的一個點。

我已經試過下面的代碼,但看起來它不是一個寫入語法的打字稿。

更新代碼:

saveMyClass(updatedMyClass: MyClass){ 
     //saving MyClass using http service 
     //return the saved MyClass or error 
     var savedMyClass : MyClass = someLogicThatReturnsTheSavedObject(updatedMyClass); 
     if(isSomeCondition) 
      return Promise.reject(new Error('No reason but to reject')); 
     else 
      return new Promise<MyClass>(resolve => {setTimeout(()=>resolve(savedMyClass),1500 )} ); 
    } 

但我驚訝的是,打字稿抱怨說「沒有最好常見類型的返回公式中存在的」。

什麼應該是正確的代碼?所以我可以使用我的組件來消費,如果返回適當的MyClass,並且反映錯誤(如果存在服務的話)。

感謝

+1

不要用打字機標記javascript!打字稿不是純粹的javascript – Endless

+0

你試過嗎? https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/es6-promise/es6-promise.d.ts –

+0

假設saveMyClass是一個函數試試這個 function saveMyClass(updatedMyClass:MyClass):any {....代碼在這裏......} –

回答

22

它被認爲是一個很好的做法,嵌入整個函數體Promise構造函數中,所以應任何錯誤發生,將它轉換爲拒絕。在這種情況下,我相信它也解決了你的問題。

saveMyClass(updatedMyClass: MyClass) { 
    return new Promise<Package>((resolve, reject) => { 
     //saving MyClass using http service 
     //return the saved MyClass or error 
     var savedPackage : Package = updatedPackage; 
     if (isSomeCondition) { 
      throw new Error('No reason but to reject'); 
     } 

     setTimeout(() => { 
      resolve(savedPackage); 
     }, 1500); 
    }); 
} 
+0

setTimeout永遠不應該用來控制這樣的事情,但由於打字稿和JavaScript從根本上打破了,不管它有多荒謬,你都可以這樣做。 – CarComp

+1

@CarComp此代碼是OPs問題的直接答案,無需任何不必要的修改。 –

+0

依靠超時依然不是好習慣。 – CarComp