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))
  • 相关阅读:
    ASP.NET面试资料【六】
    让Google帮你托管AJAX库
    JavaScript:prototype属性使用说明【转】
    如何存储Session
    给HyperLink控件连接资源文件
    Atcoder Regular Contest 096 D Sweet Alchemy(贪心+多重背包)
    NOI2021 去不了记
    一个测试你的浏览器支持多少HTML5元素的网站
    json怎么读
    QT元件(QTableView、QSql*之类)的最好开在堆空间中用指针操作
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10439223.html
Copyright © 2011-2022 走看看