1. 程式人生 > >Nodejs中控制非同步的幾種方法【陸續更新……】

Nodejs中控制非同步的幾種方法【陸續更新……】

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');