• [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))
  • 相关阅读:
    jquery easyui 推荐博客 (MVC+EF+EasyUI+Bootstrap)
    添加主键
    SSAS IIS 发布
    NLB
    实现验证码图像文字的识别(C#调用DLL)
    c#中高效的excel导入sqlserver的方法
    C# 控件的缩写
    c#3.0提供的扩展方法
    菜鸟谈谈C#中的构造函数和析构函数
    C#对注册表的操作
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10439223.html
Copyright © 2020-2023  润新知