我有一个执行异步调用的功能&成功时调用匿名函数。匿名函数的data
参数用于从服务器收集响应,但除非作为参数传递,否则它在内部函数中不可用。
callService('POST', getDataInfo, detailData, function (data) {
formDisplayGrid('.accruedGrid', '.accruedTable', 'Total Accrued');//doesn't work.
formDisplayGrid(data,'.accruedGrid', '.accruedTable', 'Total Accrued'); //works
});
callService
只是一个使用jQuery ajax发出呼叫的函数。
function callService(method, url, data, success) {
var ajaxObject = {
url: url,
method: method,
dataType: 'json',
success: success
}
if (method == 'POST') {
ajaxObject['data'] = data;
}
jQuery.ajax(ajaxObject);
}
formDisplayGrid
函数只是遍历数据集以形成HTML表格。
function formDisplayGrid(data, modalSelector, mainGridSelector, totalLabel) {
jQuery(modalSelector).modal();
if (typeof data != 'undefined' && data.Code === 200) {
var mainGrid = jQuery(mainGridSelector);
var tbody = '';
jQuery.each(data['Data']['category'], function (k, v) {
//some code here.
jQuery.each(v['subcat'], function (k, v) {
//some code here.
});
});
//some code here.
mainGrid.find('tbody').html(tbody).fadeIn(1200);
}
}
这是否正在发生,因为正在执行匿名函数
jQuery.ajax
函数,如果在callService
函数内直接执行匿名函数,它应该可用吗?
答案 0 :(得分:1)
这个概念基本上很简单,你的formDisplayGrid()函数是回调函数的外部函数,因此它不应该访问该回调函数中的私有变量。但是如果你想要第一种方法工作你将不得不在回调函数中定义函数。
答案 1 :(得分:0)
您的formDisplayGrid
函数将无法访问调用它的任何变量,除非这些变量是全局变量或它们在闭包中。
编辑:你的函数必须从某个地方得到它的data
参数 - 否则怎么知道什么数据?有一个很好的理由,只有第二个有效。
EDIT2:这是一个带闭包的解决方案:
callService('POST', getDataInfo, detailData, function (data) {
function formDisplayGrid(modalSelector, mainGridSelector, totalLabel) {
// you no longer need the data variable
jQuery(modalSelector).modal();
if (typeof data != 'undefined' && data.Code === 200) {
var mainGrid = jQuery(mainGridSelector);
var tbody = '';
jQuery.each(data['Data']['category'], function (k, v) {
//some code here.
jQuery.each(v['subcat'], function (k, v) {
//some code here.
});
});
//some code here.
mainGrid.find('tbody').html(tbody).fadeIn(1200);
}
}
formDisplayGrid('.accruedGrid', '.accruedTable', 'Total Accrued');//should work.
});