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

使用ajax从同一javascript函数多次调用,函数体和ajax成功回调之间的参数中的对象不相同,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,当我用ajax调用javascript方法时,得到了一个奇怪的结果。当用户单击箭头时,它会加载数据,我不希望用户被卡住,所以我让他在需要时进行更改。当数据从服务器返回时,我想在我的集合中的好对象上加载数据 类似的html(比这稍微复杂一点,但很难粘贴,我认为这足以理解): 但是最后加载的对象的数据总是返回。。。这是控制台日志 数组和对象在javascript中通过引用传递。你没有得到val,你得到的是dateobj的引用,如果在任何地方更改,就会在任何地方更改。我们需要“打破”参照物 通过修改传

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

类似的html(比这稍微复杂一点,但很难粘贴,我认为这足以理解):

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


数组和对象在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
是一个可以从knockout中观察到的对象,每次我调用
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.
            }
        });
}

如果看不到对LoadExactResult()的调用,很难猜测发生了什么。看起来您正在使用同一个对象重复调用它,尽管每次使用不同的值。当各种
ajax
调用返回时,它们正在打印调用对象的当前值。。我有一个会议,之后我会发布更多信息。数组和对象在javascript中通过引用传递。你没有得到val,你得到的是dateobj的参考,如果在任何地方更改,就会在任何地方更改。你应该在回答中包括对你的评论的解释。只包含代码的答案不好,因为您将
dateObj
更改为
$的原因不太清楚。extend(true,{},dateObj)
您好,谢谢您的答案,很抱歉反应太晚。问题不在于,这与dateObj是一个可从敲除中观察到的事实有关,每次我调用
dateObj()
。它正在重新计算值。我必须传递给函数
LoadExactResult
,而不是一个可观察到的敲除,而是一个真实对象
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)
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));
}
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.
            }
        });
}