装饰 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()
在主程序中被调用吗?
所以我想我可以将我的困惑归结为这些问题:
- 如果我用不同的回调对同一个承诺调用
promise.then()
两次,当承诺被解决时,这两个回调都会被调用吗?
- 如果我用不同的回调对同一个承诺调用
promise.catch()
两次,当承诺被拒绝时,两个回调都会被调用吗?
- 如果是这样,回调的顺序是否有保证(基于回调的时间 "registered")?
我对 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
假设我有一个 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()
在主程序中被调用吗?
所以我想我可以将我的困惑归结为这些问题:
- 如果我用不同的回调对同一个承诺调用
promise.then()
两次,当承诺被解决时,这两个回调都会被调用吗? - 如果我用不同的回调对同一个承诺调用
promise.catch()
两次,当承诺被拒绝时,两个回调都会被调用吗? - 如果是这样,回调的顺序是否有保证(基于回调的时间 "registered")?
我对 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