1

私は古き良き遊びをしています

  • レディス
  • ウェブディス
  • ダーツ

私はこれを書きました

#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
4

2 に答える 2

1

編集 2:このスタック オーバーフローの質問には、 readyState の変更と同様の問題があり ます。


編集:私はあなたを庭の道に少し導いたと思います-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 (インタラクティブ) になります。ドキュメントによると、この時点でサーバーから不完全な応答を取得できるはずですが、明らかにそうではありません...


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、データが完了したときにデータが完成する可能性があります。

これをテストするための適切な環境がないため、これはテストされていません

于 2012-06-22T12:42:35.817 に答える
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){
    }
  }
于 2012-06-22T15:33:36.710 に答える