2

我有一个需要从 Graph API 查询大量数据的 Facebook 应用程序。我目前可以使用 Facebook javascript-sdk 提取所有数据,但是用户必须等待 facebook 每次返回查询(0.5-1.0 秒)。我想把这个功能放在一个javascript web worker中,这样它就可以在后台持续运行,拉取数据并将其存储在一个javascript数组中,以供用户需要时使用。

我是 javascript 网络工作者的新手,但我知道他们有限制,阻止他们访问以下内容:

  • DOM(它不是线程安全的)
  • 窗口对象
  • 文档对象
  • 父对象

这些限制是否会阻止我在我的网络工作者中加载 Facebook Javascript-SDK 并使用它来拨打电话?

另外,我尝试使用:importScripts("http://connect.facebook.net/en_US/all.js");作为加载脚本的另一种方法,它给了我一个“未捕获的未定义”错误。

目前我的网络工作者在我的页面(包括用户访问令牌)之间传递数据,但我不知道如何在没有 SDK 的情况下进行 api 调用。

注意:我的应用程序仅使用 javascript,没有数据库,也没有后端服务器代码(php、ruby 等)。我需要保持这种方式。

4

2 回答 2

1

当您连接到 Facebook SDK 时,您应该在响应中收到一个 accessToken。

FB.Event.subscribe('auth.authResponseChange', function(response) {
  if (response.status === 'connected') {
    var accessToken = response.authResponse.accessToken;
  }
});

将此 accessToken 发送给您的 Web Worker:

var myWorker = new Worker(url);
myWorker.sendMessage({accessToken:accessToken});

现在您可以使用 XMLHttpRequest 和 Facebook graph api(在 web worker 内部):

//inside your worker
onmessage = function (oEvent) {
var accessToken = oEvent.data.accessToken;
if(accessToken){
    function loaded(){
      var fbResponse = this.responseText;
      postMessage({fbData: fbResponse});
    }

    var xhr = new XMLHttpRequest();
    xhr.onload = loaded;
    if (xhr != null) {
        xhr.open('get', 'https://graph.facebook.com/me?type=normal&method=GET&access_token='+accessToken, true);
        xhr.send();
    }else {
        postMessage({error: 'XHR not supported'});
    }
}else{
    postMessage({error: 'No access token'});
}
};
于 2013-12-31T01:09:03.827 回答
0
curl http://connect.facebook.net/en_US/all.js -s | grep "document" -q && echo "Nope."

这样您就不必实际执行此操作:它将打印“Nope”。

对不起。

也就是说:你应该async检查XMLHttpRequest.open.

于 2013-11-12T06:48:22.860 回答