猿问

ES6承诺解决回调吗?

无论我的Promise是否成功解决,我都想执行相同的操作。我不想将相同的功能绑定到两个参数.then。没有.always像jQuery一样的东西吗?如果没有,我该如何实现?


ES6承诺解决回调吗?

精慕HU
浏览 367回答 3
3回答

繁华开满天机

没有.always像jQuery一样的东西吗?不,还没有。尽管有一个积极的提案,但ES2018也许如此。如果没有,我该如何实现?您可以这样实现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)     );};两者都确保原始解析得以维持(当回调中没有异常时),并确保等待诺言。

偶然的你

使用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

如果您不/不能更新原型,那么破解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});
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答