我有一个样板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获取对象时,它会触发包含的函数。
那么如何在没有执行的情况下将该函数作为对象方法传递?
答案 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。它现在只会发出一次警报。