第一次淘汰赛更新递归

伊恩

我构建了一个具有用户界面的系统,每次修改都必须向服务器(应用了业务逻辑的服务器)发送一个Ajax请求,并发送回一组新的UI值。此过程不会锁定UI,因此您可以“链接”更改并一次执行多个Ajax请求。

我正在使用淘汰赛,显然想防止此处进行递归更新,所以我要做的是:

  • 将自定义订户应用于每个可观察的项目。
  • 当可观察到的更改时,将发出Ajax setFeatures请求。
  • Ajax setFeatures请求完成后,将发生Ajax getFeatures,并且仅当没有其他ajax请求正在运行时,数据才返回到回调
  • 回调设置一个标志,该标志阻止进行额外的Ajax setFeatures。
  • 此时设置可观察的可观察项,不再发送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是单线程的,我假设在执行此代码块之后更新可剔除的可观察对象是否正确?还是应该在skipUpdate标志内对其进行更新?

德米特里·扎兹(Dmitry Zaets)

通常,已更改的可观察对象会立即通知其订户,以便所有计算的可观察对象或依赖于该可观察对象的绑定都将同步更新。

为了避免此类更新并异步进行更新,您可以使用rate-limiting observable notifications基因敲除JS 3.1的新功能,在此之前有一个名为的东西throttle extender

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章