• [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();
      });
    

      

  • 相关阅读:
    世界本就很简单-云计算
    世界本就很简单-集群
    Linux虚拟机连接网络
    定时任务删除日志文件
    fiddler篡改请求数据
    Jmeter-线程日志查看
    Jmeter-JDBC Request
    Jmeter-查看结果树
    Jmeter-聚合报告
    Jmeter-参数化
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13917430.html
Copyright © 2020-2023  润新知