【发布时间】: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