假设我有一个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承诺中的这些答案特别感兴趣。
答案 0 :(得分:1)
如果我使用不同的方式两次调用
promise.then(cb)
相同的承诺 回调,在解析承诺时是否会调用两个回调?
是的,但是一旦所有回调都执行而没有抛出错误。否则,您将获得后续的catch(cb)
回调函数。
如果我使用不同的方式两次调用
promise.catch()
相同的承诺 回调,当拒绝承诺时,是否会调用两个回调?
是的, catch(cb)
之后的所有then(cb)
回调会引发错误。
如果是,则保证回调顺序