为了账号安全,请及时绑定邮箱和手机立即绑定

ES6承诺解决回调吗?

ES6承诺解决回调吗?

精慕HU 2019-09-26 14:52:39
无论我的Promise是否成功解决,我都想执行相同的操作。我不想将相同的功能绑定到两个参数.then。没有.always像jQuery一样的东西吗?如果没有,我该如何实现?ES6承诺解决回调吗?
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

没有.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)
    );};

两者都确保原始解析得以维持(当回调中没有异常时),并确保等待诺言。


查看完整回答
反对 回复 2019-09-26
?
偶然的你

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处理与异步功能混合使用,并一起玩。)


查看完整回答
反对 回复 2019-09-26
?
繁星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});


查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 366 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号