jQuery AJAX Hndling问题

我正在尝试创建一个JavaScript对象来处理我的所有ajax调用,而不是让几个不同的ajax处理程序有一个为所有人完成工作。

所以这就是我到目前为止所拥有的

我将在我的AJAX处理程序中调用的PHP文件放在一个名为ajax的目录中,其中的目录被命名为与页面相关,例如,jobs页面有自己的目录,依此类推。 在这些目录中,我已经将页面放在相关的PHP文件中。

所以现在给我的ajax Handler对象代码:

function ajaxHandler(pageName,functionCall){ this.pageName = pageName; this.functionCall = functionCall; // set functions this.getPage = getPage; this.setPage = setPage; this.getFunctionCall = getFunctionCall; this.setFunctionCall = setFunctionCall; this.performAjaxCall = performAjaxCall; } // accessor for current page function getPage(){ return this.pageName; } // accessor for setting the current page function setPage(page){ this.pageName = page; } // accessor for retrieving the current functionCall function getFunctionCall(){ return this.functionCall; } // accessor for setting the current function call function setFunctionCall(func){ this.functionCall = func; } // perform the loaded ajax call // DATA : must be in the form of JSON function performAjaxCall(data){ $.ajax({ type : 'POST', url : '/ajax/'+ this.pageName + '/' + this.functionCall + '.php', dataType : 'json', data : data, success : function(data){ return data; }, error : function(xhr, ajaxOptions, thrownError){ return {"error":true,"msg":thrownError}; } }) } 

因此,调用此文件并正常工作,除了调用performAjaxCall时,ajax工作正常,但返回的数据被视为未定义,我将向您展示一个示例

 function getActiveJobs(initPage){ var ajh = new ajaxHandler('jobs','getActiveJobs'); var req = {'page' : 1}; var data = ajh.performAjaxCall(req); alert(data.error); } 

警报返回undefined,我怀疑这是因为JavaScript没有等待返回数据,因为这样的数据还没有定义,但我不确定我是否会在这里引导自己走入死胡同之前问这里。

你是对的,JavaScript没有等待。 performAjaxCall在收到请求响应之前返回。 但即使它在等待,你也无法从这样的回调中返回一个值:

 success : function(data){ return data; }, 

您将此函数传递给$.ajax ,因此它仅在$.ajax函数内返回ne值。 它对外部performAjaxCall函数没有任何影响。

您必须传递另一个将处理数据的函数,例如:

 function performAjaxCall(data, cb){ $.ajax({ //... success: cb, error: cb }); } 

 function getActiveJobs(initPage){ var ajh = new ajaxHandler('jobs','getActiveJobs'); var req = {'page' : 1}; ajh.performAjaxCall(req, function(data) { alert(data.error); }); }