【问题标题】:decorating JavaScript promises with errors用错误装饰 JavaScript 承诺
【发布时间】:2017-12-18 14:10:00
【问题描述】:

假设我有一个 JavaScript 函数 doWork(),它返回一个承诺,并在工作完成后解决。

在我的主要业务逻辑中,我可以轻松使用它:

//main program
doWork()
.then(foo => {
  //do something when the work is finished
})
.catch(bar => {
  //handle errors
});

这很容易。

但是假设我有一个WorkingFlagService,它管理一个全局标志,指示当前是否正在执行工作。 (我不想将此功能构建到doWork() 函数中,因为实际上有许多类似的doWork() 函数;他们不应该知道任何应用程序“工作”标志。)我想使用WorkingFlagService.manageWorkingFlag “包装”对doWork() 的调用,以便它可以管理“工作”标志。使用不难的 JavaScript:

//main program
WorkingFlagService.manageWorkingFlag(doWork)
.then(foo => {
  //do something when the work is finished
})
.catch(bar => {
  //handle errors
});

WorkingFlagService.manageWorkingFlag() 方法将在工作开始前将工作标志设置为true,并在工作完成后将工作标志设置回false。这似乎是棘手的部分,假设doWork() 返回一个承诺(忽略this 的细微之处)。我知道不再有任何承诺 finally() 方法,所以我将不得不尝试创建一个解决方法。

WorkingFlagService.manageWorkingFlag = (doWorkFn)=> {
  this.isWorking = true;
  const workPromise = doWorkFn();
  workPromise
  .then( () => {this.isWorking = false;} )
  .catch( () => {this.isWorking = false;} );
  return workPromise;
}

所以如果我理解正确,在主程序中WorkingFlagService.manageWorkingFlag(doWork).then(...) 将继续正常工作; WorkingFlagService.manageWorkingFlag()在工作完成时会收到通知,以便它可以取消设置工作标志,并且在工作完成时也会通知主程序,以便它可以做接下来需要做的任何事情。

但是如果WorkingFlagService.manageWorkingFlag() 在返回promise 之前调用workPromise.catch(),如果发生错误,那么WorkingFlagService 将被通知(是否保证订单?),以便它可以关闭标志。但这会阻止.catch() 在主程序中被调用吗?

所以我想我可以将我的困惑归结为以下问题:

  • 如果我在同一个 Promise 上使用不同的回调调用 promise.then() 两次,当 Promise 被解析时,这两个回调会被调用吗?
  • 如果我在同一个 Promise 上使用不同的回调调用 promise.catch() 两次,当 Promise 被拒绝时是否会同时调用这两个回调?
  • 如果是,是否保证回调顺序(基于回调“注册”的时间)?

我对 Angular 1.x 承诺上下文中的这些答案特别感兴趣。

【问题讨论】:

  • 回答底部的 3 个问题:是、是、是。这是相关的MDN documentation
  • 耶!这一切都是为了知道在哪里看。如果您可以将其放入官方答案中,我可以将其标记为已接受。

标签: javascript angularjs promise angular-promise es6-promise


【解决方案1】:

如果我在同一个 Promise 上调用 promise.then(cb) 两次不同的 回调,当 promise 被解决时,两个回调都会被调用吗?

是的,但只要所有回调都执行而不会引发错误。否则你会得到后续的catch(cb) 回调调用。

如果我在同一个 Promise 上调用 promise.catch() 两次不同的 回调,当promise被拒绝时,两个回调都会被调用吗?

是的,所有catch(cb) 回调 then(cb) 之后都会引发错误。

如果是,回调顺序是否有保证

是的,请参阅2.2.6 in Promises/A+ specification

【讨论】:

  • 你确定这适用于 Angular 1.5 $q promises 和 $mdDialog?只是在返回之前添加空的then()catch() 调用到一个promise 似乎会以某种方式缩短进程并在它关闭之前自动解决对话promise。我会更新问题。
  • Ack,没关系 --- 我使用的是 error() 而不是 catch() (Java 甚至不会编译这个问题;我只是说),然后抛出一些嵌套承诺中间的一个异常链接了任何东西并弄乱了整个链条。它现在似乎可以工作了。
猜你喜欢
  • 2018-11-08
  • 2016-03-02
  • 2023-02-10
  • 1970-01-01
  • 2016-06-10
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多