当对象属性触发两次时传递回调

时间:2015-01-31 23:28:06

标签: javascript jquery html ajax wsgi

我有一个样板ajax调用,用于从数据库中检索和呈现表。我最初传递了多个参数,这些参数各不相同。为了概括代码,我将它们全部放入选项对象中。理想情况下,我也希望在options对象中传递回调,但我发现当我尝试将回调传递给对象时,它会执行。

见下面的第三行。取消注释时,会导致回调函数触发。

function wsgiCallbackTableData (actionobj, callback) {
  // How I would like to pass the callback in the calling function
  //actionobj.callback=callback

  // Get the data
  actionobj.action = 'gettabledata';
  if (!actionobj.hasOwnProperty('start')){
    actionobj.start = 0;
  }
  var starttime = new Date().getTime();
  $.ajax({
    url: "/wsgireadonly",
    type: "post",
    datatype:"json",                
    data: actionobj,
    success: function(response){
        console.log('SUCCESS: ' + actionobj.tablename)
        // Execute our callback function
        response = response || {};
        var now = new Date().getTime();
        response.responsetime = now - starttime;
        if (response.hasOwnProperty('etag')){
            actionobj.etag = response.etag;
        }
        callback(response,actionobj);
    }
  });   
}

当我使用类似下面的代码调用上述内容时,它可以正常工作:

function GetAndRenderTableData(options){
  var callback=RenderTableData;
  wsgiCallbackTableData(options, callback)
}

有趣的是,如果我更改对象的名称并将回调分配给随机obj,例如

var arandomobj={}
arandomobj.callback=callback;

一切都很好。因此,当ajax获取对象时,它会触发包含的函数。

那么如何在没有执行的情况下将该函数作为对象方法传递?

1 个答案:

答案 0 :(得分:1)

导致执行的actionobj.callback=callback不是。 jQuery正在这样做。我认为他们想要在data对象中执行函数来返回值。

你可以这样做:

function GetAndRenderTableData(options){
   var callback= "RenderTableData";
   wsgiCallbackTableData(options, callback)
}

然后在ajax中成功做到这一点:

    if (window[actionobj.callback])
    {
       window[actionobj.callback](response,actionobj); 
    }

由于函数实际上是窗口的属性,我们可以使用window对象来检索它们。

请参阅我的小提琴,了解完整的代码。我将成功处理程序更改为错误,因为我无法从JSFiddle成功执行xhr。它现在只会发出一次警报。

http://jsfiddle.net/nvenj38m/