nodeJS的回调编程体验
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); elsegeoXY"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<size;i+)console.log('data%d:%s',i,strLinesi);if (strLinesi.length>0) try/ 通过函数返回值 肯定是有问题的 因为GetXYjson 调用异步处理数据 / var oneGeo=GetXYjson(strLinesi);/geosObj.push(oneGeo);GetXYjson(strLinesi, 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);