Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJs请求Dart中的回调_Node.js_Dart - Fatal编程技术网

Node.js NodeJs请求Dart中的回调

Node.js NodeJs请求Dart中的回调,node.js,dart,Node.js,Dart,我正在尝试将下面的Node.js代码段转换为Dart。在我的转换中,只要有响应,就会打印“data returned…”消息,这与Node.js版本不同,Node.js版本会等待页面完成请求的2秒延迟 Node.js var http = require('http') function fetchPage() { console.log('fetching page'); http.get({ host: 'trafficjamapp.herokuapp.com', path:

我正在尝试将下面的Node.js代码段转换为Dart。在我的转换中,只要有响应,就会打印“data returned…”消息,这与Node.js版本不同,Node.js版本会等待页面完成请求的2秒延迟

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);
  });
}
飞镖


如何在Dart中实现与在Node中相同的延迟打印?提前感谢。

您可以在
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');
  };
};

您的Dart代码几乎正确,但有一个bug。您应该使用
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');
}

谢谢现在我明白了,我可以在路径命名参数前面添加“/”以使我的代码也能正常工作,但是使用query name参数可以使意图更加清晰。谢谢。现在我了解了如何使用流并获得关闭的事件。我只需重命名'in'变量,并将'/'添加到原始路径的开头。
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');
}