zoukankan      html  css  js  c++  java
  • [Javascript] Broadcaster + Operator + Listener pattern -- 13. Repeat When Done with a Repeat Operator

    Apps often have scenarios where one event controls another. In operators, this requires passing one broadcaster in and using it to control another broadcaster. You can think, "when this broadcaster fires, do that with the other broadcaster". This lesson covers using one broadcaster to control when another broadcaster repeats.

    import { addListener, done, forOf } from "./broadcasters";
    
    const log = console.log;
    
    // only when listener receive DONE event
    // then broadcaster should trigger the listener again
    // otherwise, keep emit value
    let repeat = (broadcaster) => (listener) => {
      let cancel;
      let repeatListener = (value) => {
        // when it is doen event
        if (value === done) {
          // because it is repeated event
          // need to cancel previous one
          if (cancel) {
            cancel();
          }
          // broadcaster should trigger the listener again
          cancel = broadcaster(repeatListener);
          return;
        }
        // otherwise, keep emitting value
        listener(value);
      };
      cancel = broadcaster(repeatListener);
    
      return () => cancel();
    };
    
    // Only when 'whenBroadcater' happen then do the repeat logic
    let repeatWhen = (whenBroadcaster) => (mainBroadcaster) => (listener) => {
      let mainCancel;
      let whenCancel;
      let repeatListener = (value) => {
        if (value === done) {
          if (mainCancel) {
            mainCancel();
          }
          whenCancel = whenBroadcaster(() => {
           // cancel previous when broadcaster 
            whenCancel();
            mainCancel = mainBroadcaster(repeatListener);
          });
        }
        listener(value);
      };
      mainCancel = mainBroadcaster(repeatListener);
    
      return () => {
        mainCancel();
        whenCancel();
      };
    };
    
    const inputClick = addListener("#input", "click");
    const printCat = forOf("cat");
    const repeatCatOnClick = repeatWhen(inputClick)(printCat);
    const cancel = repeatCatOnClick(log);
    
    setTimeout(() => {
      cancel();
    }, 3000);
  • 相关阅读:
    MySQL统计函数记录——按月、按季度、按日、时间段统计
    Myslq查询字段为null的数据
    表情包
    在线logo制作
    在线图片识别 图片转文字 OCR
    PDF
    php读取access数据库
    java注解的自定义和使用
    zookkeper原理学习
    mybatis源码阅读心得
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13921149.html
Copyright © 2011-2022 走看看