苦苦挣扎来解析responseText

时间:2012-06-22 12:36:15

标签: javascript xmlhttprequest redis dart

我正在玩

  • 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

2 个答案:

答案 0 :(得分:1)

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


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

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

我快速扫描http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060405/ 我发现:`readyState类型为unsigned short,readonly 对象的状态。属性MUSt是以下值之一:

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可以建立持久连接   表示除非连接被脚本终止或者   server,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 == 4status==200,那么您的数据可能会在完成时完成。

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

答案 1 :(得分:0)

使用最终解决方案。

  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){
    }
  }