2011-11-21 109 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'); }); 
}