2014-04-24 89 views
1

我正在嘗試創建一個符合當前規範(我使用這些http://promises-aplus.github.io/promises-spec/)的Typescript承諾實現(實際上是一個polyfill)。我的承諾是否符合規格?

應該這樣做,代碼在這裏https://gist.github.com/ilmattodel93/dbefa9eb86715f76e10e,但我無法理解規範的2.2.7子點。只有種族和所有靜態方法應該丟失。

請有人能解釋我的2.2.7子點,並告訴我,如果我已經正確實施他們?

感謝您的關注和時間, 馬蒂亞。

+0

爲什麼不運行測試套件? –

+2

快速瀏覽代碼至少有2個錯誤:你的'.then()'返回'this'(這實際上不僅是一個錯誤,而且錯過了promise的全部點),並且你沒有try catch圍繞'x.then'。從https://github.com/promises-aplus/promises-tests運行測試套件。 – Esailija

+0

我試了好幾個小時來使用測試套件來測試我的實現,我重寫了它,但沒辦法,仍然失敗了很多有關then方法與對象的測試。這是新的代碼:https://gist.github.com/ilmattodel93/dbefa9eb86715f76e10e/082cd93623e061727df728a9993e4f24caf24597仍然失敗了很多測試:/爲什麼?我已經實現了代碼,因爲規範說...我想。 :/ –

回答

2

讓我們讓代碼進行談話。可以說我們有一個叫做promise1的承諾。根據規範:

從規格

則必須返回一個承諾

自我explainatory:

promise2 = promise1.then(onFulfilled, onRejected); 

從規格

如果onFulfilled或onRejected返回值x,請運行Promise Resolution Procedure [[Resolve]](promise2,x)。

如果我們有

promise2 = promise1.then(()=>123,()=>123); 

然後,你可以做

promise2.then((x)=> /* x should be 123 */, (x)=> /* will not be called */); 

從規格

如果任onFulfilled或onRejected拋出一個異常E,promise2必須以e拒絕爲理由。

如果我們有

promise2 = promise1.then(()=> { throw new Error('message'); },()=> { throw new Error('message'); }); 

然後,你可以做

promise2.then((x)=> /* should not be called */, (x)=> /* x will be equal to "new Error('message')" */); 

從規格

如果onFulfilled不是一個函數和promise1滿足,promise2必須用相同的價值來實現。

如果我們有

promise1 = new Promise(function(resolve,reject) { resolve(123) }); 
promise2 = promise1.then(null,null); 

然後我們可以做

promise2.then((x)=> /* x should be 123 */, (x)=> /* should not be called */); 

從規格

如果onRejected不是一個函數和promise1被拒絕,promise2必須被同樣的理由拒絕。

如果我們有

promise1 = new Promise(function(resolve,reject) { reject(123) }); 
promise2 = promise1.then(null,null); 

然後我們可以做

promise2.then((x)=> /* should not be called */, (x)=> /* x should be 123 */); 

要驗證是否執行寫入測試,如圖所示。我建議與Chai一起使用Mocha。

+0

即使執行此操作後,承諾不通過測試:/ –