0

次の Node.js スニペットを Dart に変換しようとしています。私の変換では、ページが要求された 2 秒の遅延を完了するまで待機する Node.js バージョンとは異なり、応答があるとすぐに「データが返されました...」メッセージが出力されます。

Node.js

var http = require('http')    
function fetchPage() {
  console.log('fetching page');
  http.get({ host: 'trafficjamapp.herokuapp.com', path: '/?delay=2000' }, function(res) {
    console.log('data returned from requesting page');
  }).on('error', function(e) {
    console.log("There was an error" + e);
  });
}

ダーツ

import 'dart:io';
import 'dart:uri';

fetchPage() {
  print('fetching page');
  var client = new HttpClient();
  var uri = new Uri.fromComponents(scheme:'http', domain: 'trafficjamapp.herokuapp.com', path: '?delay=2000');
  var connection = client.getUrl(uri);

  connection.onRequest = (HttpClientRequest req) {
    req.outputStream.close();
  };

  connection.onResponse = (HttpClientResponse res){
    print('data returned from requesting page');
  };

  connection.onError = (e) => print('There was an error' ' $e');
}

Dart で Node と同じ遅延印刷を実現するにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

1

あなたの Dart コードはほぼ正しかったのですが、バグがありました。queryの代わりに名前付きパラメーターを使用する必要がありpathました。あなたのコードでどの URL が呼び出されているかはよくわかりませんが、応答には400ステータス コードがあります。読みやすくするために、Uri.fromStringコンストラクターを使用することもできます。

また、が定義されていないonRequest場合も同じコードが実行されるため、設定を省略できます。onRequest

コードは次のとおりです。

import 'dart:io';
import 'dart:uri';

main() {
  print('fetching page');
  //var uri = new Uri.fromString('http://trafficjamapp.herokuapp.com/?delay=2000');
  var uri = new Uri.fromComponents(scheme:'http',
      domain: 'trafficjamapp.herokuapp.com', query: 'delay=2000');
  var client = new HttpClient();
  var connection = client.getUrl(uri);
  connection.onResponse = (HttpClientResponse res){
    print('data returned from requesting page with status ${res.statusCode}');
  };
  connection.onError = (e) => print('There was an error' ' $e');
}
于 2012-11-14T08:51:27.313 に答える
1

onResponseこれは、コールバックのドキュメントで見つけることができます。

コールバックは、応答のすべてのヘッダーが受信され、データを受信する準備ができたときに呼び出されます。

したがって、次のように機能します。

connection.onResponse = (res) {
  print('Headers received, can read the body now');
  var in = res.inputStream;

  in.onData = () {
    // this can be called multiple times
    print('Received data');
    var data = in.read();
    // do something with data, probably?
  };
  in.onClosed = () {
    // this is probably the event you are interested in
    print('No more data available');
  };
  in.onError = (e) {
    print('Error reading data: $e');
  };
};
于 2012-11-14T07:11:18.680 に答える