第一次淘汰更新递归
First knockout update recursion
我已经构建了一个系统,其中有一个用户界面,每次修改都必须向服务器发送一个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
。
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 更新时React Redux调度导致递归错误
- React 应该组件更新太多的递归
- 递归函数使用 jQuery 每个变量值不更新
- Knockout.js:如何使用递归模板更新DOM
- 递归地更新Javascript对象
- 在react中更新状态时递归太多
- Jquery递归更新元素类
- 第一次淘汰更新递归
- 使用递归函数动态更新数组
- 如何防止在knockout.js自定义绑定中递归调用更新和值更改回调