我创建了一个通用函数,通过jQuery的AJAX调用从服务器获取数据。成功检索数据后,我想调用另一个我传入的函数(例如,在下面的代码示例中为functionAfterSuccess
)。
这个传入的函数被调用,但它似乎正在执行而不是“等待”,直到从服务器成功检索数据。
传入函数(functionAfterSuccess
)是否与主函数(genericAJAXGet
)同时执行?不知道我做错了什么。
// calling function
$('#run').on('click' , function() {
var $url = '/getdata';
var $dataToSend = { id: '123', data: 'ABC' };
genericAJAXGet("POST", $url, $dataToSend, "json", myFunction($param1));
});
// generic AJAX function
function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess) {
// build ajax request
var $request = $.ajax({
type: $type,
url: $url,
data: $dataToSend,
dataType: $returnDataType
});
// Process a successful response
$request.done(function(data) {
if(data.error) {
alert('uh oh');
} else {
// successfully returned data, but there was some application logic
if (data["type"] == "issue") {
alert('app logic issue');
} else {
// only run the passed in function when the data is successfully retrieved
functionAfterSuccess;
}
}
});
// Process a failed response
$request.fail(function() {
alert('request failure');
});
}
// Other function to be called that is being passed in as a parameter
function myFunction($param1) {
alert($param1);
}
答案 0 :(得分:3)
你可能(可能是因为你从未展示过如何调用main函数)没有传递函数,而是函数返回值:
<击> genericAJAXGet($type, $url, $dataToSend, $returnDataType, myFunction()) {
击>
相反,它应该是:
genericAJAXGet($type, $url, $dataToSend, $returnDataType, myFunction) { // <--- no parentheses
然后,在您的代码中,将其称为:
} else {
// only run the passed in function when the data is successfully retrieved
functionAfterSuccess(); // parentheses needed here to actually call it
}
此外,您可能想检查functionAfterSuccess是否存在且是否为函数。
更新
如果您希望将参数发送到回调函数,您可以在主调用中添加另一个参数:
genericAJAXGet("POST", $url, $dataToSend, "json", myFunction, $param1);
然后将其定义更改为:
function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess, functionParam) {
...
}
最后,从函数内部调用它:
} else {
// only run the passed in function when the data is successfully retrieved
functionAfterSuccess(functionParam); // now the parameter is inside the parentheses
}
为了更清楚,这是内部相关变化的功能:
function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess, functionParam) {
...
} else {
// only run the passed in function when the data is successfully retrieved
functionAfterSuccess(functionParam); // now the parameter is inside the parentheses
}
...
}
这就是你如何称呼它(用你的例子中的参数):
var $url = '/getdata';
var $dataToSend = { id: '123', data: 'ABC' };
myFunction = function(p) {
alert(p);
}
var $param1 = 'Hey there!';
genericAJAXGet("POST", $url, $dataToSend, "json", myFunction, $param1);