讓我們讓代碼進行談話。可以說我們有一個叫做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。
爲什麼不運行測試套件? –
快速瀏覽代碼至少有2個錯誤:你的'.then()'返回'this'(這實際上不僅是一個錯誤,而且錯過了promise的全部點),並且你沒有try catch圍繞'x.then'。從https://github.com/promises-aplus/promises-tests運行測試套件。 – Esailija
我試了好幾個小時來使用測試套件來測試我的實現,我重寫了它,但沒辦法,仍然失敗了很多有關then方法與對象的測試。這是新的代碼:https://gist.github.com/ilmattodel93/dbefa9eb86715f76e10e/082cd93623e061727df728a9993e4f24caf24597仍然失敗了很多測試:/爲什麼?我已經實現了代碼,因爲規範說...我想。 :/ –