[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))

猜你喜欢

转载自www.cnblogs.com/Answer1215/p/10439223.html