racecondition-dropdown-knockout-javascript

racecondition-dropdown-knockout-javascript,javascript,knockout.js,Javascript,Knockout.js,我有一个下拉列表: <select data-bind="options: activeFilters, optionsValue:'value', value:funkyThingActiveFilter, optionsText:'text'" filterResults函数然后通过AJAX获取viewmodel的更新 var url = '@Url.Action(MVC.funkyThingsController.IndexJSON())' + "?funkyThingActive

我有一个下拉列表:

<select data-bind="options: activeFilters, optionsValue:'value', value:funkyThingActiveFilter, optionsText:'text'"
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类型变量。但是,这不起作用,因为绑定似乎是异步刷新的


我怎样才能阻止页面在圆圈中旋转

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

当模型刷新时,这些副本没有更新,因为它们不是从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);
              }
         });