用于监视许多未知异步操作的设计模式

时间:2018-02-22 01:21:57

标签: javascript angular typescript

我看了: 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有点熟悉但不太熟悉它,我最近意识到它有多强大,并怀疑它会对此有所帮助。

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您使用的是rxjs,则可以使用Subject轻松解决此问题。 Subject同时是ObserverObservable - 简单来说,它可以修改自己的值(状态),其他人可以订阅它,看看值是否真的发生了变化。

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
        })
    }
}