node 流程控制

</pre><pre name="code" class="javascript">/*有时你可能会写出这样的代码
async1 ( function ( input , result1 )  {
    async2 ( function ( result2 )  {
        async3 ( function ( result3 )  {
            async4 ( function ( result4 )  {
                async5 ( function ( output )  {
                    //做一些与输出
                });
            });
        });
    });
})
而我们文艺的要求要写成这样的
myLibrary.doStuff(input, function(output){
    // do something with output
    });
如何作才能写成上面的那种?*/

//按顺序顺执行同步
// Async task (same in all examples in this chapter)
function async(arg, callback) {
    console.log('do something with \''+arg+'\', return 1 sec later');
    setTimeout(function() { callback(arg * 2); }, 1000);
    }
// Final task (same in all the examples)
function final() { console.log('Done', results); }

// A simple async series:
var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
function series(item) {
    if(item) {
    async( item, function(result) {
    results.push(result);
    return series(items.shift());
    });
    } else {
    return final();
    }
    }
series(items.shift());
//按并发执行
function async(arg, callback) {
    console.log('do something with \''+arg+'\', return 1 sec later');
    setTimeout(function() { callback(arg * 2); }, 1000);
}
function final() { console.log('Done', results); }

var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];

items.forEach(function(item) {
    async(item, function(result){
        results.push(result);
        if(results.length == items.length) {
            final();
        }
    })
});

//按并发限制执行
function async(arg, callback) {
    console.log('do something with \''+arg+'\', return 1 sec later');
    setTimeout(function() { callback(arg * 2); }, 1000);
    }
function final() { console.log('Done', results); }

var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
var running = 0;
var limit = 2;

function launcher() {
    while(running < limit && items.length > 0) {
    var item = items.shift();
    async(item, function(result) {
    results.push(result);
    running--;
    if(items.length > 0) {
    launcher();
    } else if(running == 0) {
    final();
    }
    });
    running++;
    }
    }

launcher();

//按顺序执行
function series(callbacks, last) {
    var results = [];
    function next() {
        var callback = callbacks.shift();
        if(callback) {
            callback(function() {
                results.push(Array.prototype.slice.call(arguments));
                next();
            });
        } else {
            last(results);
        }
    }
    next();
}
// Example task
function async(arg, callback) {
    var delay = Math.floor(Math.random() * 5 + 1) * 100; // random ms
    console.log('async with \''+arg+'\', return in '+delay+' ms');
    setTimeout(function() { callback(arg * 2); }, delay);
}
function final(results) { console.log('Done', results); }

series([
    function(next) { async(1, next); },
    function(next) { async(2, next); },
    function(next) { async(3, next); },
    function(next) { async(4, next); },
    function(next) { async(5, next); },
    function(next) { async(6, next); }
], final);

//并发执行
function fullParallel(callbacks, last) {
    var results = [];
    var result_count = 0;
    callbacks.forEach(function(callback, index) {
    callback( function() {
    results[index] = Array.prototype.slice.call(arguments);
    result_count++;
    if(result_count == callbacks.length) {
    last(results);
    }
    });
    });
    }
// Example task
function async(arg, callback) {
    var delay = Math.floor(Math.random() * 5 + 1) * 100; // random ms
    console.log('async with \''+arg+'\', return in '+delay+' ms');
    setTimeout(function() { callback(arg * 2); }, delay);
    }
function final(results) { console.log('Done', results); }

fullParallel([
function(next) { async(1, next); },
function(next) { async(2, next); },
function(next) { async(3, next); },
function(next) { async(4, next); },
function(next) { async(5, next); },
function(next) { async(6, next); }
], final);

//限制并发执行
function limited(limit, callbacks, last) {
    var results = [];
    var running = 1;
    var task = 0;
    function next(){
        running--;
        if(task == callbacks.length && running == 0) {
            last(results);
        }
        while(running < limit && callbacks[task]) {
            var callback = callbacks[task];
            (function(index) {
                callback(function() {
                    results[index] = Array.prototype.slice.call(arguments);
                    next();
                });
            })(task);
            task++;
            running++;
        }
    }
    next();
}
// Example task
function async(arg, callback) {
    var delay = Math.floor(Math.random() * 5 + 1) * 1000; // random ms
    console.log('async with \''+arg+'\', return in '+delay+' ms');
    setTimeout(function() {
        var result = arg * 2;
        console.log('Return with \''+arg+'\', result '+result);
        callback(result);
    }, delay);
}
function final(results) { console.log('Done', results); }

limited(3, [
    function(next) { async(1, next); },
    function(next) { async(2, next); },
    function(next) { async(3, next); },
    function(next) { async(4, next); },
    function(next) { async(5, next); },
    function(next) { async(6, next); }
], final);





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值