在Bookshelf 中使用Bluebird Promise 時,開發人員經常會遇到這樣的情況:使用類似於下面的模式:
var getEvents = function(participantId) { return new models.Participant() .query({where: {id: participantId}}) .fetch({withRelated: ['events'], require: true}) .then(function(model) { return model; }); };
但是,此程式碼會給那些不熟悉Promise的人帶來問題。 then 函數對程式碼的整體行為有任何有意義的影響嗎?如果沒有它,下面的實現能否達到相同的結果?
var getEvents = function(participantId) { return new models.Participant() .query({where: {id: participantId}}) .fetch({withRelated: ['events'], require: true}); };
問題的關鍵在於傳遞給then的函數參數。此參數預計會收到鏈中前一個 Promise 的回傳值。因此,看來 return a; then 函數中的語句本質上是無操作,因為它只是不會改變地傳遞接收到的參數。
儘管它有明顯的冗餘,但 then 函數還是有用的某些用例中的目的。一個例子是,當傳回的 Promise 需要在整個鏈中進行不同的處理時。例如,它可以被記錄、轉換為 JSON 或以自訂方式處理。另一個優點是 then 函數允許錯誤處理,儘管這也可以透過 did 來實現,這取決於所使用的 Promise 函式庫。
一般來說,建議只當真正需要時再使用。不必要的 then 函數會為程式碼庫增加不必要的複雜度並增加出錯的可能性。作為一般經驗法則,僅當傳回的 Promise 的結果或錯誤需要明確修改或處理時才合併 then。
以上是「.then(function(a){ return a; })」實際上為 Promise 做任何事情嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!