Nodejs中控制非同步的幾種方法【陸續更新……】
阿新 • • 發佈:2019-02-06
Promise是非同步程式碼實現控制流的一種方式。這一方式可以讓你的程式碼乾淨、可讀並且健壯。
Q 和 Bluebird 都是在實現 Promise A+ 標準的基礎上提供了一些封裝和幫助方法
1.非同步回撥原生寫法
serverClient.get("http://localhost:3001/test/test.php?page=1&page_count=1", function (err,res,data1) { // something serverClient.get("http://localhost:3001/test/test.php?page=2&page_count=1", function (err,res,data2) { // something serverClient.get("http://localhost:3001/test/test.php?page=3&page_count=1", function (err,res,data3) { // something console.log(data1); console.log(data2); console.log(data3); }); }); }); console.log('showFirst');
2.eventproxy 控制併發
var eventproxy = require('eventproxy'); var ep = new eventproxy();
ep.all('data1_event', 'data2_event', 'data3_event', function (data1, data2, data3) { console.log(data1); console.log(data2); console.log(data3); }); serverClient.get('http://localhost:3001/test/test.php?page=1&page_count=1', function (err,res,data) { ep.emit('data1_event', data); }); serverClient.get('http://localhost:3001/test/test.php?page=2&page_count=1', function (err,res,data) { ep.emit('data2_event', data); }); serverClient.get('http://localhost:3001/test/test.php?page=3&page_count=1', function (err,res,data) { ep.emit('data3_event', data); }); console.log('showFirst');
3.async(可控制併發數量)
var async = require('async'); var maxCount = 0; var pageArr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]; async.mapLimit(pageArr, 5, function (id, callback) { getdata(id, callback); }, function (err, result) { console.log('final:'); console.log(result); }); function getdata(id,callback) { var delay = parseInt((Math.random() * 10000000) % 2000, 10); maxCount++; var url = "http://localhost:3001/test/test.php?page="+id+"&page_count=1"; console.log('現在的併發數是', maxCount, ',正在抓取的是', url); setTimeout(function () { serverClient.get(url, function (err,res,data) { maxCount--; callback(null,data); }); }, delay); }
4.fibers(非同步轉同步)
var fiber= require('fibers');
function getDataOnFiber(req,res,type,url) { let fiber = Fiber.current; let l = {}; serverClient.get(url,function(res,req,data){ }); serverClient.get(url).then( result=>{ if(result.res.statusCode == 200){ l={code:200,data:result.body}; }else{ l={code:result.res.statusCode}; } fiber.run(); }, err=>{ console.log(err); l={code:500}; fiber.run(); } ); Fiber.yield(); return l; }
Fiber(() => { var url = 'http://10.10.20.78/test/test.php'; let result = getDataOnFiber(req,res,config.serverType.engine1_6,url+"?page=1&page_count=1"); let result2 = getDataOnFiber(req,res,config.serverType.engine1_6,url+"?page=2&page_count=1"); let result3 = getDataOnFiber(req,res,config.serverType.engine1_6,url+"?page=3&page_count=1"); console.log(result); console.log(result2); console.log(result3); }).run(); console.log('showFirst');