2012-11-14 110 views
0

我试图将下面的Node.js代码片段转换为Dart。在我的转换中,只要有响应,就会立即打印'data returned ...'消息,与Node.js版本不同,该版本等待页面完成所请求的2秒延迟。NodeJs在飞镖中请求回调

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'); 
} 

如何实现达特相同延迟打印中的节点?提前致谢。

回答

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'); 
} 
+0

谢谢。我现在看到,我可以在名为参数的路径前添加'/',以使我的代码也可以工作,但使用查询名称参数可以使意图更加清晰。 – basheps

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'); 
    }; 
}; 
+0

感谢这一点。我现在看到如何使用流并获得关闭的事件。我只需要重命名'in'变量,并且必须将'/'添加到我原始路径的开头。 – basheps