最近在做爬虫的时候,在使用http模块发送请求时,希望拿到请求响应的数据后,再对数据进行解析。当然可以用回调函数解决,阅读性差了点,写起来也比较臃肿。
可以尝试用q。
//导入相关模块
var http = require('http'),
Q = require('q');
//请求参数
var options = {
hostname: 'yourHost.com',
path: '/test',
method: 'GET'
};
function promisedRequest( options ) {
//实例化一个延迟对象
var deferred = Q.defer();
var req = http.request( options, function(response) {
response.setEncoding('utf8');
var responseData = '';
response.on('data', function(data) {
responseData += data;
});
response.on('end', function() {
//这里表示成功执行时,调用resolve方法
deferred.resolve(responseData);
});
});
//listen to the 'error' event
req.on('error', function(err) {
//失败时,调用reject方法
deferred.reject(err);
});
req.end();
//返回promise对象
return deferred.promise;
};
promisedRequest( options )
.then(function(response) { //执行resolve方法时,参数是上个函数执行得到的结果
console.log(JSON.stringify(response));
}, function(error) { //失败执行reject方法
console.log(error);
});
这里就避免了过多的回调,并且同样能合理的管理异步事件。