【问题标题】:Extract Data from Anonymous Function Scope从匿名函数范围中提取数据
【发布时间】:2011-07-13 06:26:34
【问题描述】:

由于这个应用程序的复杂性,我需要像这样包装 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 插件(也许是一个预制的包装器),但运气不佳。

【问题讨论】:

    标签: javascript facebook asynchronous scope anonymous-function


    【解决方案1】:

    从您的问题来看,您似乎正在寻找同步调用。这意味着您希望在调用它之后立即使用从 api 调用返回的数据。在这种情况下,您需要检查 FB.api 是否支持同步调用(大多数情况下不支持)。

    否则,您需要了解您在此处进行 async 调用。这意味着您应该将处理代码放在传递给 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);
    

    【讨论】:

    • 感谢您的回复。真的,我正在寻找这些 API 调用的包装器,这样我就可以拥有更多的 OO 应用程序。建模为:app.FBAPICall(),然后能够从此调用返回值。但是,我看到异步处理程序是由 JS 线程中的最顶层对象调用的,而不是由我的应用程序对象调用的。
    • 你是对的。异步调用需要编码的“延续”风格,与正常的过程风格完全不同。在“延续”风格中,您从内到外进行编码。将异步 JavaScript 调用转换为同步调用并不总是容易(或可能),因为 JavaScript 是单线程的——正如你所提到的,回调是由 JS 线程调用的,你不应该阻塞。
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多