无论我的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
提交
取消