2016-03-13 49 views
1

我知道這不是覆蓋原生JS API的最佳方法,而是我爲實驗做的更多。是否可以覆蓋原生Es6承諾解決方法?

我想覆蓋無極解決方法處理程序做的每個解決一些額外的邏輯。可能嗎?

+1

你試過了嗎?我的意思是如果你能夠覆蓋整個Promise對象,那麼這是可能的。如果你不能那麼我會想象你只能夠改變原型承諾對象,而不是基地Promise對象本身 – Binvention

+2

因爲你使用es6,我寧願繼續並創建一個包裝類 – harishr

+0

你能顯示一個例子?請記住,我想保留Promise類名。 –

回答

4

是的,這是可能的。你必須包裝Promise.prototype.then方法。

Promise.prototype.then = (oldThen=>{ 
    return function then(_successHandler, _rejectHandler){ 
     /* your logic here; 
     remember: both successHandler and rejectHandler can be non-functions */ 
     return oldThen.call(this, wrappedSuccessHandler, wrappedRejectHandler); 
    } 
})(Promise.prototype.then); 

這個代碼將無法攔截new Promise()電話,但有其他的解決方法是:

class SubPromise extends Promise { 
    constructor(executor) { 
     super(function(_resolve, _reject) { 
      /* your code goes here */ 
      return executor(wrappedResolve, wrappedReject); 
     }); 
    } 

    then(success, reject) { 
     return super.then(wrappedSuccessHandler, wrappedRejectHandler); 
    } 
} 
window.Promise = SubPromise; 

它取代全球Promise財產與實施,使所有後續調用解析爲window.Promise將返回你的實現。

請參閱25.4.5.3 Promise.prototype.then規範的進一步細節(與默認處理程序「投擲者」和「身份」)。