Javascript 第一次淘汰更新递归

Javascript 第一次淘汰更新递归,javascript,knockout.js,Javascript,Knockout.js,我已经构建了一个系统,在这个系统中,我有一个用户界面,每次修改都必须向服务器发送一个Ajax请求(应用了业务逻辑),并返回一组新的UI值。此过程不会锁定UI,因此您可以“链接”更改并同时执行多个Ajax请求 我正在使用knockout,显然是想阻止递归更新在这里进行,所以我所做的是: 将自定义订阅者应用于每个可观察项目 当可观察到的更改时,会发出Ajax setFeatures请求 Ajax setFeatures请求完成后,只有在没有其他Ajax请求运行时,才会发生Ajax getFeatu

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

我正在使用knockout,显然是想阻止递归更新在这里进行,所以我所做的是:

  • 将自定义订阅者应用于每个可观察项目
  • 当可观察到的更改时,会发出Ajax setFeatures请求
  • Ajax setFeatures请求完成后,只有在没有其他Ajax请求运行时,才会发生Ajax getFeatures,并将数据返回回调
  • 回调设置了一个标志,该标志阻止创建其他Ajax设置功能
  • 在这一点上,将设置淘汰观测值,不再发送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标志内更新它们?

通常,更改的可观察对象会立即通知其订户,以便同步更新依赖于可观察对象的任何计算可观察对象或绑定


为了避免这样的更新并进行异步更新,您可以使用knockoutJS 3.1的新功能,在这之前有一个叫做
节流扩展器的东西,我有点理解您的问题,我很同情,但是如果没有更接近于一个小的修改,我们将很难帮助您。我担心你必须朝着这个方向努力,或者你最好用橡皮鸭(或者用一个拼贴画/朋友,这可能也行)来解决这个问题。@Jeroen是的,明白这一点。当时正在进行部署,无法轻松获取源代码,但我也在尝试理解理论,而不是解决方案,这就是为什么我发布了我的方法,而不仅仅是代码。有趣的是,我实际上使用了一种方法,它的异步性可以解释我所看到的影响。我会检查一下。答案有点倒退,但问题出在我使用RateLimiter时,异步更新是在循环和skipUpdate设置回false之后发生的。