回调作为对象 属性 触发两次

Callback passed as object property fires twice

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

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

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)
}

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

var arandomobj={}
arandomobj.callback=callback;

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

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

导致执行的不是 actionobj.callback=callback。 jQuery 正在这样做。我认为他们想在 data 对象内执行函数到 return 值。

你可以这样做:

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

然后在 ajax 成功时执行此操作:

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

因为函数实际上是 window 的属性,我们可以使用 window 对象检索它们。

查看我的 fiddle 以获取完整代码。我将成功处理程序更改为错误,因为我无法从 JSFiddle 成功执行 xhr。它现在只会触发一次警报。

http://jsfiddle.net/nvenj38m/