异步编程

深入浅出node.js第四章


1. 函数式编程

高阶函数(传入或输出函数的函数)
偏函数( Curry化 )
function addParams(baseFun, fn) { //工厂方法
    var slice = Array.prototype.slice,
        baseFunArgsCount = baseFun.length,
        superFun = function() {
            var oldArgs = slice.call(arguments, 0, baseFunArgsCount),
                moreArgs = slice.call(arguments, baseFunArgsCount),
                ret = baseFun.apply(this, oldArgs);    
            
            if (moreArgs.length > 0) {
                ret = fn.call(this, superFun, ret, moreArgs);
            }
            
            return ret;
        };
    return superFun;
}

function getMore(fn, ret, args) { //辅助方法
    return [ret].concat(fn.apply(this, args));
}

function $el(id) { //基础方法
    return document.getElementById(id);
}

//通过ID取元素们
window._$el = addParams($el, getMore);

/*
<div id="doc">
    <div id="hd"></div>
    <div id="bd"></div>
    <div id="ft"></div>
</div>  

_$el('doc') //<div id=​"doc">​…​</div>​

_$el('hd', 'ft') //[<div id=​"hd">​…​</div>​, <div id=​"ft">​…​</div>​]

_$el('doc', 'hd', 'ft') //[<div id=​"doc">​…​</div>​, <div id=​"hd">​…​</div>​, <div id=​"ft">​…​</div>​]
*/

2.异步编程的优势和难点

优势

  1. 非阻塞I/O
  2. 并行处理能力
  3. 充分发挥CPU、I/O资源

难点

  1. 异常处理(callback执行时机)
  2. 函数嵌套过深(node的callback机制)
  3. 不能阻塞代码(同步式编程习惯)
  4. 多线程编程(Web Workers)
  5. 异步转同步

异步编程解决方案

  1. 事件发布/订阅
  2. Promise/Deferred模式
  3. 流程控制库
 

书里设计到的工具思路

  1. events.EventEmitter
  2. EventProxy
  3. Promise/Deferred
  4. 尾触发 /NEXT
  5. async 
  6. Step
  7. wind
  8. Bagpipe

总结

回调
事件
流程 
串行、并行、依赖管理、阻塞式思路进行异步编程
并发控制

nodejs-c4

By 胡尊杰

nodejs-c4

深入浅出node.js学习

  • 746