zoukankan      html  css  js  c++  java
  • [Javascript] Broadcaster + Operator + Listener pattern -- 12. Repeat a broadcaster that is DONE

    After a broadcaster is "done", starting it up again requires calling the broadcaster with the same listener. This creates a kind of "async recursion" where you pass the listener back into the broadcaster each time you set it up. This lesson walks through creating a repeat operator that can start a broadcaster over.

    Idea for Repeat operator, is that when source broadcaster emit done, then in repeat operator call the broadcaster(repeatListener) again.

    let repeat = (broadcaster) => (listener) => {
      let cancel;
      let repeatListener = (value) => {
        if (value === done) {
          if (cancel) {
            cancel();
          }
          cancel = broadcaster(repeatListener);
          return;
        }
    
        listener(value);
      };
      cancel = broadcaster(repeatListener);
    
      return () => {
        cancel();
      };
    };

    import { createTimeout, done } from "./broadcasters";
    import { hardCode } from "./operators";
    
    let repeat = (broadcaster) => (listener) => {
      let cancel;
      let repeatListener = (value) => {
        if (value === done) {
          if (cancel) {
            cancel();
          }
          cancel = broadcaster(repeatListener);
          return;
        }
    
        listener(value);
      };
      cancel = broadcaster(repeatListener);
    
      return () => {
        cancel();
      };
    };
    
    let one = repeat(hardCode("hi")(createTimeout(1000)));
    
    let cancel = one(console.log);
    setTimeout(() => {
      cancel();
    }, 5000);
    
    
    // broadcasters.js
    import { curry } from "lodash"
    export let done = Symbol("done")
    
    export let createTimeout = curry((time, listener) => {
      let id = setTimeout(() => {
        listener(null)
        listener(done)
      }, time)
    
      return () => {
        clearTimeout(id)
      }
    })
    
    
    // operators.js
    import { curry } from "lodash";
    import { done } from "./broadcasters";
    
    let createOperator = curry((operator, broadcaster, listener) => {
      return operator((behaviorListener) => {
        return broadcaster((value) => {
          if (value === done) {
            listener(done);
            return;
          }
    
          behaviorListener(value);
        });
      }, listener);
    });
    
    export let hardCode = (newValue) =>
      createOperator((broadcaster, listener) => {
        let cancel = broadcaster((value) => {
          listener(newValue);
        });
    
        return () => cancel();
      });
    

      

  • 相关阅读:
    数据准备2 数据清洗
    数据准备1 数据导入、导出
    数据分析基本流程 Python基本数据类型 Python各种括号的使用方式
    fineBI 学习成果展示1
    未确认融资收益的计算
    合同现金流量
    公允价值持续计算的金额
    发放股票股利
    权益法未实现内部交易损益的调整
    营业外收入入不入损益
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13917430.html
Copyright © 2011-2022 走看看