2010-04-21 107 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);