2011-11-21 129 views
2

下面是一个简单的ajax调用包装在方法中。javascript jquery ajax成功返回对象

MyNS.GetStringList = function (successCallback, failedCallback) { 
var methodUrl = serverUrl + "/GetStringList"; 
$.ajax({ 
    type: "GET", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    url: methodUrl, // Location of the service 
    data: {}, //Data sent to server 
    beforeSend: function (XMLHttpRequest) { 
     //ensures the results will be returned as JSON. 
     XMLHttpRequest.setRequestHeader("Accept", "application/json"); 
    }, 
    success: successCallback, 
    error: failedCallback 
}); 
} 

以下是调用上述方法的方法。

function GoGetTheStringList() { 
     var stringList; 
     stringList = MyNS.GetStringList(function (data) { return data.d; }, function (XmlHttpRequest, textStatus, errorThrown) { 
      alert("error"); 
     }); 

     alert(reasonsDictionary); // THIS IS UNDEFINED! 

    } 

使第一个方法返回data.d对象的正确语法是什么?

一如既往的感谢! 乔恩

回答

6

它不能真的。 Ajax调用是异步的,这意味着该方法将在调用success回调之前返回。

编辑/更正:您可以这样做,但你必须async选项设置jQuery的阿贾克斯false,这意味着你将要执行同步调用,这意味着你的整个应用程序将等待它返回。如果您调用success时将最好的回调函数传递给您的函数。

作为对您编辑的回应:是的,它将是未定义的,因为它不在上下文中。你需要做的是从回调中处理你的数据,因为那时你会知道你有它,并且因为你不能返回数据作为函数B的函数A的结果。在你的回调中,你应该调用一个函数来处理你得到的数据。

var latestData; 
function getStuff(succeeded,failed) {...} 
function gotStuff(dataWrapper) { 
    latestData = dataWrapper.d; 
    doThingsWithStuffData(dataWrapper.d); 
} 

getStuff(gotStuff, function() { ... }); 
+0

自从我第方法没有return语句,没有东西返回。在成功方法中添加return语句也不起作用。如果我在$ .ajax调用之前添加一个返回值,我得到具有responseText属性的jhqr对象,但不知道它有多安全,因为它可能还没有返回。 – user1231231412

+0

对不起。起初我完全误解了你的观点。我知道你不能从异步调用返回。那么,有没有办法通过引用来传递一个值类型,所以我不必把我的逻辑放在那个调用中? – user1231231412

+0

你不需要把你的逻辑放在那里。如果你检查我的回复,你会看到我在回调中调用另一个函数来处理我的数据,解包后。另外,技术上所有的对象参数都是通过Javascript中的引用传递的。 –

0

您可以使用jQuery deffered,因为它更适合于此目的。

MyNS.GetStringList = function() { 
var methodUrl = serverUrl + "/GetStringList"; 
return $.ajax({       // return here, this will returns a deffered object 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      url: methodUrl, // Location of the service 
      data: {} //Data sent to server 
     }); 
} 

你不应该需要做

beforeSend: function (XMLHttpRequest) { 
      //ensures the results will be returned as JSON. 
      XMLHttpRequest.setRequestHeader("Accept", "application/json"); 
      }, 

这就是dataType: 'json'做什么,它给jQuery的一个提示,在从服务器的响应所期待的。

然后在你的功能

function GoGetTheStringList() { 
     var stringList; 
     $.when(MyNS.GetStringList()) 
     .done(function(data){ console.log(data.d); }); 
     .fail(function(data) { console.log('Request failed'); }); 
}