【问题标题】:Struggling to parse responseText努力解析 responseText
【发布时间】:2012-06-23 16:03:23
【问题描述】:

我玩得很开心

  • Redis
  • Webdis
  • 飞镖

这是我写的

#import('dart:html');
#import('dart:json');

class ChatClient {
  XMLHttpRequest listener;
  int parsePosition = 0;

  void connect(){
    this.listener = new XMLHttpRequest();
    this.listener.open("GET", "http://i.target.co.uk:9005/subscribe/test.json", true);
    this.listener.setRequestHeader('Accept', 'application/json');
    this.listener.on.readyStateChange.add(handleData);
    this.listener.send();
  }

  void handleData(Event event){
    print(this.listener.responseText);
    /*
    if (this.listener.responseText != ""){
      Map data = JSON.parse(this.listener.responseText);
      print(data["subscribe"]);
    }
    */
  }
}

void main(){
  ChatClient client = new ChatClient();
  client.connect();
  document.query('#status').innerHTML = 'Loaded!';
}

问题是,每次我发布一些内容时,responseText 的大小都会像这样增长

{"subscribe":["subscribe","test",1]}
{"subscribe":["subscribe","test",1]}{"subscribe":["message","test","e"]}
{"subscribe":["subscribe","test",1]}{"subscribe":["message","test","e"]}{"subscribe":["message","test","e"]}

现在你无法解析

{"subscribe":["subscribe","test",1]}{"subscribe":["message","test","e"]}{"subscribe":["message","test","e"]}

那我该怎么办?你能清除responseText吗?冲洗缓冲区?有什么?

编辑:我知道您可以迭代整个字符串或跟踪每个 json 对象的长度,但没有更简洁的方法吗?

编辑:使用新的打印语句

readyStat: 2 status: 200
{"subscribe":["subscribe","test",1]}
readyStat: 3 status: 200
{"subscribe":["subscribe","test",1]}{"subscribe":["message","test","e"]}
readyStat: 3 status: 200

【问题讨论】:

  • 如果你有兴趣,你应该看看hyperdex.org - 这是我最喜欢的键/值存储,而且速度非常快。
  • @Glycerine 可以,想先修好飞镖:P
  • 检查编辑 - 我还在谷歌搜索 - 我曾经遇到过类似的问题,但它消失了......
  • @Glycerine 只是为了让您知道,这永远不会从状态 3 改变。
  • 我的帮助没有帮助那么老兄。

标签: javascript xmlhttprequest redis dart


【解决方案1】:

编辑 2: 这个堆栈溢出问题与readyState变化有类似的问题: Ajax readystate 3 (Chrome / IE) - 我正在努力寻求更多体面的帮助。


编辑:我想我已经把你带到花园小路上了 - ajax 请求的响应状态表明 (3) 它仍在加载/接收信息。

这并不直接适用于您的问题,但我觉得这是问题的一部分。

我快速浏览了http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060405/ 我发现:`readyState of type unsigned short, readonly 对象的状态。该属性必须是以下值之一:

0 Uninitialized
    The initial value.
1 Open
    The open() method has been successfully called.
2 Sent
    The UA successfully completed the request, but no data has yet been received.
3 Receiving
    Immediately before receiving the message body (if any). All HTTP headers have been received.
What about HEAD requests?
4 Loaded
    The data transfer has been completed.

所以在第 3 阶段,我们有 responseText 持有部分数据。

来自http://jszen.blogspot.co.uk/2005/03/xmlhttp-and-readystate.html:

... URI /some/uri 可以建立一个持久连接,它 意味着除非连接被脚本或 服务器,readyState 将始终为 3(交互式)。根据 docs,我应该能够从服务器获取不完整的响应 这一次,但显然不是......


在 msdn 上,我发现了这个http://msdn.microsoft.com/en-us/library/ie/ms534361(v=vs.85).aspx:

不能调用 responseBody 和 responseText 属性来获取 部分结果(readyState = 3)。这样做会返回错误, 因为没有完全收到响应。你必须等到所有 数据已收到。


第一个答案:

void handleData(Event event){
  print(this.listener.responseText);

  int a = this.listener.readyState;
  int b = this.listener.status;
  print("readyStat: $a status: $b");

  if (this.listener.readyState == 4 && this.listener.status == 200) {
    if (this.listener.responseText != ""){
      Map data = JSON.parse(this.listener.responseText);
      print(data["subscribe"]);
    }
  }
}

在接收器对象上,您将拥有一个 readyState 和一个状态。如果您等到readyState == 4 和status==200 处于完成状态,您的数据可能会在您完成后完成。

这是未经测试的,因为我没有合适的环境来测试它

【讨论】:

  • 您的侦听器对象是否包含变量readyState 和status?我可能使用 this 定位了错误的对象
  • 是的。它们都是this.listener 对象的变量
  • 我在方法中添加了打印字符串,打印出什么值?
【解决方案2】:

使用的最终解决方案。

  void connect(){
    this.listener = new XMLHttpRequest();
    this.listener.open("GET", "http://i.h.co.uk:9005/subscribe/test", true);
    this.listener.setRequestHeader('Accept', 'application/json');
    this.listener.on.readyStateChange.add(handleData);
    this.listener.send(); 
  }

  void handleData(Event event){
    try {
      Map data = JSON.parse(this.listener.responseText.substring(this.parsePosition));
      this.parsePosition = this.listener.response.length;
      var message = data['subscribe'][2];
      print("Recieved> $message");
    } catch (final e){
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 2017-11-09
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2014-01-05
    • 2021-02-23
    相关资源
    最近更新 更多