2010-04-21 73 views
2

需要幫助。我寫一個函數,返回ajax調用的結果,但我沒有得到任何結果,我想這是一個範圍問題,但有沒有辦法做到這一點?這裏是我的代碼:返回ajax調用結果的JavaScript函數

function Favorites() { 
    var links; 
    $.ajax({ 
     type: "GET", 
     url: "/Services/Favorite.svc/Favorites", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     cache: false, 
     success: function(msg) { 
      links = (typeof msg.d) == 'string' ? eval('(' + msg.d + ')') : msg.d; 
     } 
    }); 
    return links; 
}; 

回答

3

你的問題是,你正在做的HTTP請求asnychronous和Ajax請求之前,您Favorites函數返回已經回來了。一旦響應已經回來了,你需要改變你的功能,使得它接受要執行的回調:

function Favorites(callback) { 
    $.ajax({ 
     type: "GET", 
     url: "/Services/Favorite.svc/Favorites", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     cache: false, 
     success: function(msg) { 
      var links = (typeof msg.d == 'string') ? eval('(' + msg.d + ')') : msg.d; 
      callback(links); 
     } 
    }); 
}; 

Favorites(function(links) { alert(links); }); 

旁白:慣例是隻打算用作構造函數應該用大寫字母開頭,所以你的功能可以更好地命名爲favorites

+0

感謝很多答案和評論! – ilkin 2010-04-21 16:00:13

6

Ajax是異步的,即當執行return links時,success中的回調函數甚至可能未被調用。

擴展你的函數接受回調:

function Favorites(callback) { 
    var links; 
    $.ajax({ 
     type: "GET", 
     url: "/Services/Favorite.svc/Favorites", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     cache: false, 
     success: callback 
    }); 
}; 

,並稱之爲:

var callback = function(msg) { 
     links = (typeof msg.d) == 'string' ? eval('(' + msg.d + ')') : msg.d; 
     // do other stuff with links here 
} 

Favorites(callback);