[Functional Programming] Capture Side Effects in a Task / Async

We examine the data structure Task, see some constructors, familiar methods, and finally how it captures side effects through laziness.

 

We are going to check two libarays, one is 'data.task'. another is 'crocks/Async':

Install:

npm i -S data.task
npm i -S crocks

 

You can use 'of' construct method:

 Task.of(1)
    .fork(e => console.error(e), a => console.log(a)) // 1

 Async.of('U Wut M8')
  .fork(e => console.error(e),a => console.log(a)) // U Wut M8

 

You can do rejection:

 // Foucs to reject:
 Task.rejected('not work')   
 .fork(e => console.error(e), a => console.log(a)) // not work

 Async.Rejected('Async badguy')
  .fork(e => console.error(e),a => console.log(a)) // Async badguy

 

You can .map / .chain:

 Task.of(1)
    .map(x => x + 1)
    .fork(e => console.error(e), a => console.log(a)) // 2


Task.rejected(1)
    .map(x => x + 1)
    .fork(e => console.error(e), a => console.log(a)) // 1 
    
Async.of(1)
    .map(x => x + 1)
    .fork(e => console.error(e),a => console.log(a)) //2
  
Async.Rejected(1)
    .map(x => x + 1)
    .fork(e => console.error(e),a => console.log(a)) // 1

Task.of(1)
    .map(x => x + 1)
    .chain(x => Task.of(x + 2))
    .fork(e => console.error(e), a => console.log(a)) // 4    

Async.of(1)
    .map(x => x + 1)
    .chain(x => Async.of(x + 2))
    .fork(e => console.error(e),a => console.log(a)) // 4  

 

You can use 'contructor function':

const lunchMissiles = () =>
    new Task((rej, res) => {
        console.log('lunchMissiles');
        res('missile!')
    });    
  
const lunchRocky = () =>
    Async((rej, res) => {
        console.log('lunchRocky');
        res('Rocky!')
    });       

lunchMissiles()
    .map(x => x + "!")
    .fork(e => console.error(e), a => console.log(a)) // lunchMissiles missile!!


lunchRocky()
    .map(x => x + "!")
    .fork(e => console.error(e), a => console.log(a)) // lunchMissiles missile!!    

 

Finally, we can split the side effect without calling 'fork', and you compose with the rest of app:

const taskApp =  lunchMissiles()
.map(x => x + "!");

const asyncApp = lunchRocky()
    .map(x => x + "!")


taskApp.map(x => "   From Task").fork(e => console.error(e), a => console.log(a))
asyncApp.map(x => "   From Async").fork(e => console.error(e), a => console.log(a))

 

posted @ 2019-02-26 18:34  Zhentiw  阅读(245)  评论(0编辑  收藏  举报