nodeJS的回调编程 体验

       在nodejs代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
下面只能说调用了IO 异步,然后用回调进行了数据处理。
  
1 . 读取http 是异步等待数据流 ,并在回调函数中进行处理数据

http.get('http://www.example.com/', function (response) {});

当客户端发送请求并接收到完整的服务端响应头时,就会调用回调函数。在回调函数中,除了可以使用response对象访问响应头数据外,还能把response对象当作一个只读数据流来访问响应体数据
在下面函数里
1.1 在http.get 中我们传入回调函数 function (response) 进行处理 response
1.2 然后在回调函数 function (response) 里 又调用了 response.on事件详见机制 ,在事件 传入回调函数
由于在请求的响应数据流是json 格式,要想通过JSON.parse 分析数据,就需要等待数据全部获取,如果只是部分数据 ,则可能因为数据不全个出错。 因此在data 实际中 需要将数据合并起来 body.push(chunk); 。然后
在end 数据中对数据进行分心,并获取需要的数据。
1.3 而针对获取的数据 需要如何处理,也可以等待回调函数 进行处理,所以在获取数据完毕后调用 callback(geoXY);
function GetXYjson(addrstr, callback)
{
try
{
http.get('http://map.sh.xxxxx.cn/sisserver?highLight=false&config=GOC&address='+addrstr+'&resType=json&enc=utf-8&a_k=f519b1aee05755b300c69f742198d6749124bfbaf76b2ea6b45eff3bc8e4399188888×××××d',
function (response) {
var body = [];
var geoXY={};
console.log("Got response: " + response.statusCode);
//console.log(response.headers);
response.on('data', function (chunk) {
body.push(chunk);
//console.log(chunk.toString('utf8'));
});
response.on('end', function () {
console.log( 'jieguo num: %d',body.length);
if (body.length>1)
{
body = Buffer.concat(body);
//console.log(body.toString());
};
try
{
var jsonData = JSON.parse(body);

//console.log(jsonData["list"]);
console.log(jsonData["list"].length);
if (jsonData["list"].length>0)
{
geoXY["address"]=addrstr;
geoXY["name"]=jsonData["list"][0]["name"];
console.log(jsonData["list"][0]["x"]);
geoXY["x"]=jsonData["list"][0]["x"];
console.log(jsonData["list"][0]["y"]);
geoXY["y"]=jsonData["list"][0]["y"];
console.log(' find Geo for num address:%s',addrstr);

}else
{

geoXY["address"]=addrstr;
geoXY["name"]='';
geoXY["x"]=0;
geoXY["y"]=0;
console.log('can not find Geo for num address:%s',addrstr);
}


}
catch(err)
{
// throw err;
geoXY["address"]=addrstr;
geoXY["name"]='';
geoXY["x"]=0;
geoXY["y"]=0;
console.log('Error: %s',err.message);

};
callback(geoXY);
});

});
}
catch(err)
{
console.log('Error: %s',err.message);
throw err;
};

}
2 . 处理多个http请求的响应数据值
2.1 从文件中读取请求值,通过data 事件 进行异步处理 ,传入回调函数,对请求值进行http 请求
2.2 调用上面单个Http请求 GetXYjson,并传入该函数的回电函数,在回电函数中逐个将获取的响应题的值
push 到一个对象,并在最后一个请求回调返回后,进行处理结果对象。如何处理,通过调用回掉函数
callback(geosObj);
function GetXYSFromFileAsyc(src,callback)
{
var rOption ={ flags: 'r',
encoding: 'utf8',
fd: null,
mode: 0666,
autoClose: true
};

var frs = fs.createReadStream(src,rOption);
var geosObj=[];
frs.on('data', function(chunk){
console.log('got %d bytes of data', chunk.length);
var strLines=chunk.split('\n');
for(var i=0,size=strLines.length;i console.log('data%d:%s',i,strLines[i]);
if (strLines[i].length>0)
{
try
{
// 通过函数返回值 肯定是有问题的 因为GetXYjson 调用异步处理数据
// var oneGeo=GetXYjson(strLines[i]);
//geosObj.push(oneGeo);
GetXYjson(strLines[i], function(oneGeo)
{
geosObj.push(oneGeo);
console.log('data %s: push XY ',JSON.stringify(oneGeo));
console.log('geosObj len %D: ',geosObj.length);
if ( geosObj.length==size )
{
console.log('push end');
callback(geosObj);
} ;
});
}
catch(err)
{
console.log('data%d: err:%s',i,err.message);
continue;

}
};
}
});
frs.on('end',function(){
console.log('readStream end');
});
console.log('read end');
// return geosObj;
}
3. 等待所有响应获取分析完毕后 ,进行统一写入文件处理
调用GetXYSFromFileAsyc函数进行文件处理,并传入回调函数,对响应值进行写入操作。
function writeGeoXYtoFile(src,dst)
{
var wOption = {
flags: 'a',
encoding: 'utf8',
mode: 0666 ,
autoClose: true
};
var fws = fs.createWriteStream(dst,wOption);

GetXYSFromFileAsyc(src, function(geosObj)
{
fws.write(JSON.stringify(geosObj),'utf8');
// fws.write(Buffer.concat(geosObj),'utf8');
console.log('write end ');
});

// 有问题 异步 和同步 有问题 向下代码 有问题,就是用同步的思想,处理异步函数调用
/*
var geosObj=[];
geosObj=GetXYSFromFile(src);
console.log('lengh',geosObj.length);
if (geosObj.length>0)
{
fws.write(Buffer.concat(geosObj),'utf8');

}
console.log('write end ');
*/
//console.log('get geo %d',data.length);

}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/523892/viewspace-1247328/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/523892/viewspace-1247328/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值