装饰JavaScript承诺错误

时间:2017-07-13 16:43:17

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

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

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

//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()返回一个promise(忽略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()在返回承诺之前调用workPromise.catch(),如果发生错误,则会通知WorkingFlagService(订单是否有保证?),以便它可以关闭该标志。但是这会阻止在主程序中调用.catch()吗?

所以我想我可以将我的困惑提炼到这些问题:

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

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

1 个答案:

答案 0 :(得分:1)

  

如果我使用不同的方式两次调用promise.then(cb)相同的承诺   回调,在解析承诺时是否会调用两个回调?

是的,但是一旦所有回调都执行而没有抛出错误。否则,您将获得后续的catch(cb)回调函数。

  

如果我使用不同的方式两次调用promise.catch()相同的承诺   回调,当拒绝承诺时,是否会调用两个回调?

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

  

如果是,则保证回调顺序

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