使用ajax从同一个javascript函数多次调用,对象在函数体和ajax成功回调之间的参数不相同

Multiple call from same javascript function with ajax, object in parameters not the same between the function body and the ajax success callback

本文关键字:ajax 之间 回调 成功 参数 函数体 对象 函数 javascript 同一个 使用      更新时间:2023-09-26

当我用ajax调用javascript方法时,得到了一个奇怪的结果。当用户点击箭头时,它会加载数据,我不希望用户被卡住,所以我让他在需要的时候更改。当数据从服务器返回时,我希望在我的集合中的好对象处加载数据。

html(比这复杂一点,但很难粘贴,我认为这已经足够理解了):

  <a href='#' data-bind='click:LoadExactResult'>Next</a>

js:

 function LoadExactResult(dateObj) {
    //method body
    (function(dateObj) {
        var payload = {
            searchCriteriaParam: "",
        };
        console.log(moment() + " - Calling Exact Date: " + dateObj().Date());
        dateObj().IsAllFlightLoading(true);
        $.ajax({
            url: 'bla/bla',
            data: payload,
            cache: false,
            success: function(result) {
                console.log(moment() + " - Exact Date Success: " + dateObj().Date());
                // ajax body.
            }
        });
    })(dateObj);
}

但是最后加载的对象的数据总是会返回。。。这是控制台日志。

1410377364469 - Calling Exact Date: Mon Jan 05 2015 22:00:00 GMT-0500 (Est) 
1410377365234 - Calling Exact Date: Sun Jan 04 2015 21:10:00 GMT-0500 (Est) 
1410377365539 - Calling Exact Date: Sat Jan 03 2015 20:40:00 GMT-0500 (Est) 
1410377367559 - Exact Date Success: Sat Jan 03 2015 20:40:00 GMT-0500 (Est) 
1410377370488 - Exact Date Success: Sat Jan 03 2015 20:40:00 GMT-0500 (Est) 
1410377375648 - Exact Date Success: Sat Jan 03 2015 20:40:00 GMT-0500 (Est)

数组和对象在javascript中通过引用传递。你没有得到一个val,你得到的是dateobj的引用,如果在任何地方更改,就会在所有地方更改。我们需要"打破"参考通过修改传递到自执行函数中的参数。

function LoadExactResult(dateObj) {
  //method body
  (function(dateObj) {
      var payload = {
          searchCriteriaParam: "",
      };
      console.log(moment() + " - Calling Exact Date: " + dateObj().Date());
      dateObj().IsAllFlightLoading(true);
      $.ajax({
          url: 'bla/bla',
          data: payload,
          cache: false,
          success: function(result) {
              console.log(moment() + " - Exact Date Success: " + dateObj().Date());
              // ajax body.
          }
      });
  })($.extend(true, {}, dateObj));
}

这个问题与dateObj是从敲除中可观察到的事实有关,每次我都在调用dateObj()。它正在重新计算值。我必须通过的不是一个可以观察到的敲除函数LoadExactResult,而是一个真实的对象

function LoadExactResult(dateObj) {
    //method body
        var payload = {
            searchCriteriaParam: "",
        };
        console.log(moment() + " - Calling Exact Date: " + dateObj.Date());
        dateObj.IsAllFlightLoading(true);
        $.ajax({
            url: 'bla/bla',
            data: payload,
            cache: false,
            success: function(result) {
                console.log(moment() + " - Exact Date Success: " + dateObj.Date());
                // ajax body.
            }
        });
}