【问题标题】:Design pattern for monitoring many unknown async operations用于监控许多未知异步操作的设计模式
【发布时间】:2018-02-22 01:21:56
【问题描述】:

我读到: 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 的 cmets 以及它干净且有效的事实,直到我从社区听到其他消息,我下面的原始解决方案似乎很好:

class TestApp {

  _processCount = 0;

  get isProcessing() {
    return this._processCount > 0;
  }


  asyncTest() {
    this._processCount++;
    setTimeout(() => {
      this._processCount--;
    }, 500);
  }
}

注意:Angular 5 项目。对 Rx/js 有点熟悉,但不是很专业,我最近意识到它的强大,并怀疑它在这里会有所帮助。

非常感谢!

【问题讨论】:

  • 在这里使用简单的解决方案绝对没有错(这真的不是 hacky)。它绝对是最易读的,任何使用 Rx/js 的解决方案最终都会保留一些正在运行的进程列表,这比保持简单的计数更糟糕。

标签: javascript angular typescript


【解决方案1】:

如果您使用的是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
        })
    }
}

【讨论】:

  • 这与仅将布尔值分配给变量有何不同?无论哪种方式,您都只能读取最新的值,如果任何进程完成,即使其他进程仍在运行,它也会说没有正在处理。
  • @SimonK 不确定您要传达的内容,但这些是展示反应式编程有用性的最少代码。 OP 声明asyncTest() 可以由用户在任何时间点调用。如何以及何时调用 .next() 完全取决于 OP 自己
  • 我不是想成为这里的工具,但您实际上并没有回答这个问题,而且您发布的代码没有让 OP 更接近答案。如果我们使用您的建议,它将像这样:进程'A'开始,所以我们 .next(true);进程“B”开始,.next(true);进程“A”完成,.next(false);在这个阶段,isProcessing() 将返回 false,即使进程“B”正在运行。
  • 就像我说的,我只是在演示如何使用.next()。 OP never 声明有 ProcessAProcessBProcessC,我不会假设任何事情。 asyncTest() 中的方法,正如 cmets 中所写,是他可以在那里更新值的地方。他可以创建任何其他函数/方法来更新subject,是的;但这完全取决于他。
猜你喜欢
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
相关资源
最近更新 更多