第一次淘汰更新递归

First knockout update recursion

本文关键字:递归 更新 淘汰 第一次      更新时间:2023-09-26

我已经构建了一个系统,其中有一个用户界面,每次修改都必须向服务器发送一个Ajax请求(在服务器上应用业务逻辑),并为UI发送一组新的值。这个过程不会锁定UI,所以你可以"连锁"更改,并有多个Ajax请求同时进行。

我使用了knockout,显然想要防止这里发生递归更新,所以我所做的是:

  • 为每个可观察项应用自定义订阅者
  • 当一个可观察对象发生变化时,会发出一个Ajax setFeatures请求。
  • Ajax setFeatures请求完成后,只有在没有其他Ajax请求运行
  • 时,才会发生Ajax getFeatures并将数据返回给回调
  • 这个回调函数设置了一个标志来阻止额外的Ajax setFeatures。
  • Knockout observable被设置为,此时不应该再发送Ajax请求
  • 该标志被恢复为允许Ajax请求再次发送。

我注意到的是,这个循环第一次发生(setFeatures, getFeatures)时,每个淘汰可观察对象都会触发另一个setFeatures(这个过程在这里停止并且不递归)。

在此初始运行之后的任何点,它的行为都与预期一致。这是相当困难的共享大量的代码,但我认为这可能是由于以下原因:

  skipUpdate = true;
 // Update each of the knockout fields
 $(data).each(function () {
    var block = viewModel[this.Block];
    var item = block[this.Name]
    item.control.value(this.Value);    // item.control.value is the observable
 });
 skipUpdate = false;

由于JavaScript是单线程的,我是否正确地假设knockout可观察对象在执行此代码块后更新?或者应该在skipUpdate标志中更新它们?

通常情况下,一个可观察对象被改变后会立即通知它的订阅者,这样任何依赖于该可观察对象的计算可观察对象或绑定都会同步更新。

为了避免这样的更新和异步更新,你可以使用 rate-limiting observable notifications ,这是knockoutJS 3.1的新特性,在此之前,有一个东西,叫做throttle extender