2011-03-11 58 views
3

由于此应用程序的复杂性,我需要包装Facebook API调用,就像这样。从匿名函数范围提取数据

//In main file, read is always undefined 
var read = fb_connect.readStream(); 

// In fb_wrapper.js 
function readStream() { 
    var stream; 

    FB.api('/me/feed', {limit:10000}, function (response) { 
     stream = response.data; 
    }); 

    return stream; 
} 

我知道,由于呼叫的异步性质,readStream()功能的其余部分将返回stream(没有值)。我很难找到一种将数据从回调函数范围中取出并返回到更高范围的方法。 FB API调用返回正常(我调试了它一百次),但获取响应数据一直是迄今为止的战斗。

如果有人有任何建议,将不胜感激。我搜索了一下Facebook的jQuery插件(可能是预制的包装),但运气不错。

回答

2

从您的问题来看,您似乎在寻找同步呼叫。这意味着你想在调用API后立即使用从API调用返回的数据。在这种情况下,你需要检查FB.api是否支持同步调用(通常不支持)。

否则,您需要了解您正在调用异步。这意味着您应该将处理代码放入您传递给FB.api的回调函数中。这被称为编写代码的“延续”风格,并且是使用异步调用的标准方式。

FB.api('/me/feed', {limit:10000}, function (response) { 
    var stream = response.data; 
    // Do your processing here, not outside!!! 
}); 

或者:

function handlerFunction(response) { 
    // Do your processing here 
} 

FB.api('/me/feed', {limit:10000}, handlerFunction); 
+0

感谢您的答复。真的,我正在寻找这些API调用的包装,所以我可以有更多的面向对象的应用程序。建模如下:'app.FBAPICall()',然后能够从这个调用中返回值。但是,我发现异步处理程序由JS线程中的最顶层对象调用,而不是由我的应用程序对象调用。 – Mark 2011-03-13 17:45:08

+0

你说得对。异步调用需要“继续”编码风格,与正常的过程风格完全不同。在“继续”的风格中,你从内到外编码。将异步JavaScript调用转换为同步调用并不总是很容易(或可能),因为JavaScript是单线程的 - 正如您所提到的那样,回调由JS线程调用,您不应该阻止。 – 2011-03-14 03:32:08