Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Streams, events and promises (node.js)

Avatar for Len Weincier Len Weincier
October 18, 2013

Streams, events and promises (node.js)

Jozi Node.js user group presentation

Avatar for Len Weincier

Len Weincier

October 18, 2013
Tweet

More Decks by Len Weincier

Other Decks in Programming

Transcript

  1. NODE.JS ? Platform built on the V8 javascript engine Tyrannically

    asynchronous, devilishly event-oriented and amazoidingly non-blocking
  2. ON THE RIGHT HAND SIDE / / s y n

    c c o d e - u n u s u a l v a r x = d o _ t h i s ( w i t h _ t h i s ) / / a s y n c - m o r e n a t u r a l d o _ s o m e t h i n g ( w i t h _ t h i s , c a l l _ m e _ w h e n _ d o n e ) ;
  3. EVENTS ARE THE WAY events.EventEmitter s e r v e

    r . o n ( ' c o n n e c t i o n ' , f u n c t i o n ( s t r e a m ) { c o n s o l e . l o g ( ' s o m e o n e c o n n e c t e d ! ' ) ; } ) ; same as emitter.addListener(event, listener)
  4. WHEN YOU ARE READY f u n c t i

    o n c o o k i n g C o m p l e t e d ( ) { e m i t t e r . e m i t ( ' c o o k e d ' , ' c h i c k e n ' } ) ; } e m i t t e r . o n ( ' c o o k e d ' , f u n c t i o n ( f o o d ) { c o n s o l e . l o g ( ' y o u r ' + f o o d + ' i s r e a d y ! ' ) ; } ) ;
  5. EVENT DRIVEN ? Only a single thread, ever, seriously !

    f o r ( v a r i = 1 ; i < = 3 ; i + + ) { s e t T i m e o u t ( f u n c t i o n ( ) { c o n s o l e . l o g ( i ) ; } , 0 ) ; } ;
  6. EVENTS FTW ! v a r s t a r

    t = n e w D a t e ; s e t T i m e o u t ( f u n c t i o n ( ) { v a r e n d = n e w D a t e ; c o n s o l e . l o g ( ' T i m e e l a p s e d : ' , e n d - s t a r t , ' m s ' ) ; } , 5 0 0 ) ; w h i l e ( n e w D a t e - s t a r t < 1 0 0 0 ) { } ;
  7. NO MORE INTERRUPTIONS ! You don't have to worry about

    your code being swapped out. No more stress about concurrency.
  8. STREAMS Streams are an API for event sources and sinks.

    Streams all inherit from EventEmitter. Readable Writable Duplex Transform PassThrough
  9. WHY ? so that we can pipe() things ! s

    r c . p i p e ( d s t )
  10. READABLE STREAM so that we can pipe() things ! v

    a r R e a d a b l e = r e q u i r e ( ' s t r e a m ' ) . R e a d a b l e ; v a r r s = n e w R e a d a b l e ; r s . p u s h ( ' b e e p ' ) ; r s . p u s h ( ' b o o p \ n ' ) ; r s . p u s h ( n u l l ) ; r s . p i p e ( p r o c e s s . s t d o u t ) ;
  11. LAZILY EFFICIENT v a r R e a d a

    b l e = r e q u i r e ( ' s t r e a m ' ) . R e a d a b l e ; v a r r s = R e a d a b l e ( ) ; v a r c = 9 7 - 1 ; r s . _ r e a d = f u n c t i o n ( ) { i f ( c > = ' z ' . c h a r C o d e A t ( 0 ) ) r e t u r n r s . p u s h ( n u l l ) ; s e t T i m e o u t ( f u n c t i o n ( ) { r s . p u s h ( S t r i n g . f r o m C h a r C o d e ( + + c ) ) ; } , 1 0 0 ) ; } ; r s . p i p e ( p r o c e s s . s t d o u t ) ; p r o c e s s . o n ( ' e x i t ' , f u n c t i o n ( ) { c o n s o l e . e r r o r ( ' \ n _ r e a d ( ) c a l l e d ' + ( c - 9 7 ) + ' t i m e s ' ) ; } ) ; p r o c e s s . s t d o u t . o n ( ' e r r o r ' , p r o c e s s . e x i t ) ;
  12. WHAT IS A PROMISE ? AND ABSTRACTION FOR ASYNC PROGRAMMING

    THAT PROXIES THE ASYNC CODE - KRIS KOWAL (Q)
  13. CLEANER READING v a r p r o m i

    s e = d o S o m e t h i n g A y n c ( ) p r o m i s e . t h e n ( o n F u l f i l l e d , o n R e j e c t e d ) d o S o m e t h i n g A y n c ( f u n c t i o n ( e r r , d a t a ) { / / h a n d l e s t u f f h e r e } )
  14. EVEN CLEANER v a r p r o m i

    s e = d o S o m e t h i n g A y n c ( ) . t h e n ( d o A n o t h e r A s y n c T h i n g ) . t h e n ( a n d A n o t h e r A s y n c T h i n g ) . t h e n ( a n d A l s o A s y n c T h i n g ) d o S o m e t h i n g A y n c ( f u n c t i o n ( r e s u l t s ) { d o A n o t h e r A s y n c T h i n g ( f u n c t i o n ( f u n c t i o n ( r e s u l t s ) { a n d A n o t h e r A s y n c T h i n g ( f u n c t i o n ( f u n c t i o n ( r e s u l t s ) { a n d A l s o A s y n c T h i n g ( f u n c t i o n ( f u n c t i o n ( r e s u l t s ) { / / h a n d l e s t u f f h e r e } ) } ) } ) } )
  15. MAKING A PROMISE f u n c t i o

    n f s _ r e a d F i l e ( f i l e , e n c o d i n g ) { v a r d e f e r r e d = Q . d e f e r ( ) f s . r e a d F i l e ( f i l e , e n c o d i n g , f u n c t i o n ( e r r , d a t a ) { i f ( e r r ) d e f e r r e d . r e j e c t ( e r r ) / / r e j e c t s t h e p r o m i s e e l s e d e f e r r e d . r e s o l v e ( d a t a ) / / f u l f i l l s t h e p r o m i s e } ) r e t u r n d e f e r r e d . p r o m i s e / / t h e p r o m i s e i s r e t u r n e d } f s _ r e a d F i l e ( ' m y f i l e . t x t ' ) . t h e n ( c o n s o l e . l o g , c o n s o l e . e r r o r )