精慕HU
2019-09-26 14:52:39
無論我的Promise是否成功解決,我都想執行相同的操作。我不想將相同的功能綁定到兩個參數.then。沒有.always像jQuery一樣的東西嗎?如果沒有,我該如何實現?ES6承諾解決回調嗎?
3 回答

繁華開滿天機
TA貢獻1816條經驗 獲得超4個贊
沒有
.always
像jQuery一樣的東西嗎?
如果沒有,我該如何實現?
您可以這樣實現finally
自己的方法:
Promise.prototype.finally = function(cb) { const res = () => this const fin = () => Promise.resolve(cb()).then(res) return this.then(fin, fin);};
或更廣泛地講,將解析信息傳遞給回調:
Promise.prototype.finally = function(cb) { const res = () => this return this.then(value => Promise.resolve(cb({state:"fulfilled", value})).then(res) , reason => Promise.resolve(cb({state:"rejected", reason})).then(res) );};
兩者都確保原始解析得以維持(當回調中沒有異常時),并確保等待諾言。

偶然的你
TA貢獻1841條經驗 獲得超3個贊
使用async / await,可以將await
與結合使用try/finally
,如下所示:
async function(somePromise) { try { await somePromise(); } finally { // always run this-- even if `somePromise` threw something }}
這是我使用Babel的異步生成器插件在Node中進行生產的一個真實示例。
// Wrap promisified function in a transaction blockexport function transaction(func) { return db.sequelize.transaction().then(async t => { Sequelize.cls.set('transaction', t); try { await func(); } finally { await t.rollback(); } });}
我在Mocha測試中和Sequelize ORM一起使用此代碼來啟動數據庫事務,并且無論測試中數據庫調用的結果如何,總是在最后回滾。
這大致類似于Bluebird的.finally()
方法,但是IMO,語法好得多!
(注:在你想知道為什么我不區分await
第一承諾-荷蘭國際集團是Sequelize的實現細節它使用。CLS為“捆綁” SQL事務的無極鏈凡是招,里面同樣鏈因此,在Promise上等待將“關閉”交易區塊并破壞了鏈條,我舉了這個示例向您展示如何將“香草” Promise處理與異步功能混合使用,并一起玩。)

繁星coding
TA貢獻1797條經驗 獲得超4個贊
如果您不/不能更新原型,那么破解a的方法是:
executeMyPromise().then(function(res){ return {res: res}; }).catch(function(err){ return {err: err}; }).then(function(data) { // do finally stuff if (data.err) { throw data.err; } return data.res;}).catch(function(err) { // handle error});
添加回答
舉報
0/150
提交
取消