在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博客 ” ,链接:https://blog.itpub.net/523892/viewspace-1247328/
,如需转载,请注明出处,否则将追究法律责任。