想象一下以下基於承諾,例如:Promise有沒有'最後'的模式?
function treadLightly() {
return Promise.resolve()
.then(function() { allocateResource(); })
.then(function() { doRiskyOperation(); })
.then(function() { releaseResource(); })
.catch(function() { releaseResource(); })
;
}
我們想打電話releaseResource()
與否doRiskyOperation()
做出決議或拒絕。但是在兩個不同的地方呼叫releaseResource()
有一股代碼味道。
我們真正想要的是與javascript的finally
等效的東西。
有沒有一個更清潔的方式來編碼在承諾?
值得一讀這篇文章關於[資源管理使用承諾](http://bluebirdjs.com/docs/api/resource-management.html)甚至'.finally()'並不總是完美的選擇,它討論了使用處置器的設計模式。 – jfriend00
爲什麼用'Promise.resolve()。然後(函數(){allocateResource();})。然後(...)'而不是'allocateResource()。然後(...) ?如果'allocateResource()'不是異步的,那麼爲什麼它在promise鏈中呢? – jfriend00
@ jfriend00:因爲它是一個很好的模式:)。 'allocateResource()'可能會也可能不會返回一個承諾,除非可以看看它的代碼,否則你不會知道。使用'Promise.resolve()'開始一個鏈,使鏈對'allocateResource()'返回的內容不敏感,並且(更重要的是)使意圖清晰。 –