我看了: Design pattern for managing multiple asynchronous JavaScript operations 但是这个问题没有明确的解决方案,而且这个问题非常陈旧且依赖于jQuery。
我的情况有点类似,无法用promise.all 来解决,因为用户可以随意调用异步任务,这是他们喜欢的频率。
我要做的是查看所有异步操作何时处于空闲状态。什么时候asyncTest真的无所事事。
这必须是一个常见的检查,只是想知道它是如何完成的。
用户可以随时调用asyncTest。
class TestApp {
processing = false;
asyncTest() {
this.processing = true;
setTimeout(() => {
this.processing = false;
}, 500);
}
}
正如您所看到的,这将发生碰撞。
其他异步任务可能希望查看这是否是处理。 我考虑过以下内容,但感觉非常愚蠢
编辑:嗯,基于Simon K的评论以及它干净利落的事实,直到我从社区听到其他消息,我的原始解决方案似乎还不错:
class TestApp {
_processCount = 0;
get isProcessing() {
return this._processCount > 0;
}
asyncTest() {
this._processCount++;
setTimeout(() => {
this._processCount--;
}, 500);
}
}
注意:Angular 5项目。我对Rx / js有点熟悉但不太熟悉它,我最近意识到它有多强大,并怀疑它会对此有所帮助。
非常感谢!
答案 0 :(得分:0)
如果您使用的是rxjs
,则可以使用Subject
轻松解决此问题。 Subject
同时是Observer
和Observable
- 简单来说,它可以修改自己的值(状态),其他人可以订阅它,看看值是否真的发生了变化。
class TestApp {
// initialize the variable with an initial value of false
processing = new BehaviourSubject<boolean>(false);
asyncTest() {
//just use .next() to update the subject
this.processing.next(true);
}
get isProcessing() {
//now you can just subscribe to the subject and check its current value
this.processing.subscribe(processingStatus => {
console.log(processingStatus)//will give you true or false
})
}
}