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);
  • 相关阅读:
    创建索引
    异常处理之ThreadException、unhandledException及多线程异常处理
    Extjs ComboBox常用的配置
    制作Visual Studio项目模板
    wince更改桌面
    创建链接服务器
    IP查询接口
    软件工程未来发展趋势
    在SQL Server数据库开发中的十大问题
    .NET 2.0中的企业库异常处理块
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13921149.html
Copyright © 2011-2022 走看看