装饰 JavaScript 有错误的承诺

decorating JavaScript promises with errors

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

在我的主要业务逻辑中,我可以很方便地使用它:

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

这很简单。

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

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

WorkingFlagService.manageWorkingFlag()方法会在工作开始前将工作标志设置为true,并在工作完成后将工作标志设置回false。这似乎是棘手的部分,假设 doWork() returns 一个承诺(忽略 this 的微妙之处)。我知道不再有任何 promise 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()在主程序中被调用吗?

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

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

If I invoke promise.then(cb) on the same promise twice with different callbacks, will both callbacks be called when the promise is resolved?

是的,但是一旦所有回调都执行完没有抛出错误。否则你会得到后续的 catch(cb) 回调调用。

If I invoke promise.catch() on the same promise twice with different callbacks, will both callbacks be called when the promise is rejected?

是的,所有 catch(cb) 回调 after then(cb) 抛出错误。

If so, is order of callback guaranteed

是的,参见 2.2.6 in Promises/A+ specification