2014-01-21 67 views
53

這可能是一個愚蠢的問題,但中期承諾鏈,你如何拒絕來自其中一個功能的承諾?例如:如何拒絕內部承諾然後功能

someActionThatReturnsAPromise() 
    .then(function(resource) { 
     return modifyResource(resource) 
    }) 
    .then(function(modifiedResource) { 
     if (!isValid(modifiedResource)) { 
      var validationError = getValidationError(modifiedResource); 
      // fail promise with validationError 
     } 
    }) 
    .catch(function() { 
     // oh noes 
    }); 

不再有對原始解析/拒絕函數或PromiseResolver的引用。我是否應該添加return Promise.reject(validationError);

+1

拋出一個異常? – thefourtheye

+1

'throw validationError' – kavun

+0

><我有一種感覺,這將是一件愚蠢/容易的事情。猜猜我一直在想我必須調用專用的拒絕函數,或者返回失敗的Promise。因此,從promise/thenable中,任何不是新Promise的返回值都將被視爲已解決的值?如果我拋出一個錯誤,這與返回一個立即被拒絕的Promise相同?如果您將其作爲答案發布,我會接受它。 – chinabuffet

回答

62

我是不是應該加return Promise.reject(validationError);

是的。然而,僅it's that complicated jQuery中,有Promise/A+兼容庫,你也可以簡單地

throw validationError; 

所以,你的代碼會再看看像

someActionThatReturnsAPromise() 
    .then(modifyResource) 
    .then(function(modifiedResource) { 
     if (!isValid(modifiedResource)) 
      throw getValidationError(modifiedResource); 
     // else ! 
     return modifiedResource; 
    }) 
    .catch(function() { 
     // oh noes 
    }); 
+0

這是一個經常性的事情嗎?它被廣泛使用嗎?我覺得這樣做很糟糕,因爲如果代碼'.catch'中的某處丟失了,** whole **應用程序將會爆炸並顯示無法處理的錯誤。 –

+2

請注意,在符合Promise/A +的庫中,您可以使用throw,因爲'then'的'handler'是同步的,並且可以捕獲異常。如果處理程序是異步的,它必須返回一個最終拒絕的承諾。所以總是返回Promise.reject()而不是拋出對我來說很有意義。因爲如果你拋出一個異步處理程序,庫不能捕捉它,它會默默地通過。謹防。 –

+1

@MikeGleasonjrCouturier:應該沒有異步處理程序不是'.then'處理程序的承諾:-)如果您使用的不是promisified API,那麼即使'返回Promise.reject()'也會對您有所幫助。 – Bergi