JSON.parse意外结束数据firefox插件

时间:2013-09-25 18:56:53

标签: javascript json firefox firefox-addon firefox-addon-sdk

我使用附加组件构建一个具有基本功能的插件:
- 从第http://youtube.com页获得评论(A) - 调用Web服务器处理此文本(A)并返回json
- 用(B)代替(A)并将其显示给用户
我对服务器的请求有问题(参见浏览器控制台有很多行):

GET http://localhost:8084/Test/Test [HTTP/1.1 200 OK 8ms]
JSON.parse unexpected end of data fire fox addon. 

但最后的请求是成功的。 我的代码不会更改评论,因为它在请求响应之前已更改

LIB / main.js

var tag = "p";
var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");

pageMod.PageMod({
  include: "*.youtube.com",
  contentScriptFile: data.url("element-getter.js"),
  contentScriptWhen: "end"      
});

数据/元素getter.js

var target = document.querySelector('#watch-discussion');

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    var commenttexts = document.querySelectorAll(".comment-text");
    for (var i = 0; i < commenttexts.length; ++i) {
          var url = "http://localhost:8084/Test/Test";        
          var request = new XMLHttpRequest();
          var cm = " hello ";
          request.open("GET", url, true);
          request.onload = function () {
            var jsonResponse = JSON.parse(request.responseText);
            var status = jsonResponse.status;
            cm = status;
          };
          request.send();             
          commenttexts[i].innerHTML = cm;
    }         
  });    
});
var config = { childList: true };
observer.observe(target, config);

json服务器返回:

{"status":"1","label":"true"}

1 个答案:

答案 0 :(得分:1)

您正在创建一个异步请求,所以这部分:

commenttexts[i].innerHTML = cm;
当请求响应时,即在request.onload函数内,而不是在request.send();之后,应该调用

。最后,它意味着它将在请求返回之前首先运行该部分。

你应该有这样的东西:

for (var i = 0; i < commenttexts.length; ++i) {
  (function(i) {
    var request = new XMLHttpRequest();
    var cm = " hello ";
    request.open("GET", url, true);
    request.onload = function () {
        var jsonResponse = JSON.parse(request.responseText);
        var status = jsonResponse.status;
        cm = status;
        commenttexts[i].innerHTML = cm;
    };

    request.send();
  })(i);
}

这种方式只有在它返回时才会被更改,并且您可以访问onload函数中的i变量。