zoukankan      html  css  js  c++  java
  • [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))
  • 相关阅读:
    [Matlab] 短时傅里叶变换spectrogram函数
    [Word] Word中保存出矢量图
    [Matlab] Matlab 2020b Release Note
    [Matlab] Matlab 2020b Release Note
    [Matlab] Matlab 2020b Release Note
    [Matlab] Matlab 2020b Release Note
    [Matlab] 画图颜色扩展
    [脑电相关] 关于ERD现象
    [PPT技巧] PPT箭头设置及文字设置
    linux 新添加的硬盘格式化并挂载到目录下方法
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10439223.html
Copyright © 2011-2022 走看看