关于Node.js里面的Transform Stream类型

通常,Nodejs的Stream处理是异步的,这意味着,

(1)你不能连续写2条语句:buf = input,read(); output.write(buf)。

    为什么?前一句read是异步的,意味着语句执行完之后,实际上根本可能还没IO ready,没有获取到数据呢!——当然,异步IO是基于callback的,或者promise的。我这里是为了叙述的方便。

(2)所以,对异步IO,基于callback的写法应该是:

  input.read( (buf)=> { output.write(buf, ()=>{console.log("1 buf copy done!")}), })

或者Promise化的语法:

input.read().then( (buf)=> output.write(buf); )

Promise看起来像是个语法糖,但它与callback有本质的不同:callback的回调过程仍然是同步的,这意味着在深度嵌套callback的过程中,栈有可能溢出。

而对Promise而言,Promise的then仅仅代表向JS语言的执行环境状态机注册一个state change的callback。一个Promise可以串起多个then,但这些then每个都是单独从核心event loop直接dispatch的,因此不存在栈溢出的问题。

进一步的语法糖就是把Promise转换为ES7 async/await的写法。实际上是把Promise转换为了Future对象,当需要从Future对象实际get原始类型数据的时候,就会陷入IO-bloc

你可能感兴趣的:(读书笔记,node.js,异步IO,流式Transform,Stream,Promise)