竞争条件 - 下拉 - 淘汰赛 - javascript

时间:2013-03-20 15:41:08

标签: javascript knockout.js

我有一个下拉:

<select data-bind="options: activeFilters, optionsValue:'value', value:funkyThingActiveFilter, optionsText:'text'"

从此下拉菜单中选择一些内容后,将调用一个函数来刷新整个模型

model.funkyThingActiveFilter.subscribe(function (newVal) {
        model.filterResults();


});

filterResults函数然后通过AJAX获取viewmodel的更新

var url = '@Url.Action(MVC.funkyThingsController.IndexJSON())' + "?funkyThingActiveFilter=" + model.funkyThingActiveFilter();

 $.ajax({
           url: url,
           dataType: 'json',
           success: function (returnedData) {
               ko.mapping.fromJS(returnedData, {}, model);
              }
         });

问题在于,当用户看到模型更新时,这会启动竞争条件。 我试过在filterResults函数上设置一个淘汰赛节流,但这只会延迟竞争条件。

我也尝试创建信号量 - 其中filterResults函数设置一个inFunction类型变量。但是这不起作用,因为绑定似乎是异步刷新的。

如何停止围绕圈子的页面?!

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我在knockout viewmodel创建时创建了一个过滤器副本。 然后我将下拉列表绑定到副本,并将副本作为参数传递给AJAX get。

当模型刷新时,这些副本没有更新,因为它们不是从AJAX请求返回的viewmodel数据的一部分。因此没有竞争条件。