• [Javascript] Broadcaster + Operator + Listener pattern -- 2 Unsubscribe from Broadcaster


    Because Javascript has inconsistent way to cleanup the lisenters:

    removeEventListener(button, "click")
    clearnTimeout(id)

    We can implement a contract to provide a consistent way to do unsubscribe:

    let button = document.getElementById("button");
    
    let createEventBroadcaster = (element, eventType) => (listerner) => {
      element.addEventListener(eventType, listerner);
    };
    
    let buttonClick = (listener) => {
      createEventBroadcaster(button, "click")(listener);
      // implement a contract to stop the event listener
      return () => {
        button.removeEventListener("click", listener);
      };
    };

    Return a function to clean up.

    Usage

    let stopAfter3Times = (broadcater) => (listener) => {
      let i = 0;
      let stop = broadcater((value) => {
        listener(value);
        i++;
        if (i === 3) stop();
      });
    };
    
    stopAfter3Times(buttonClick)(log);

    Implement a stopWhen operator:

    let interval = (listener) => {
      let id = setInterval(() => {
        listener("hello");
      }, 1000);
    
      return () => {
        clearInterval(id);
      };
    };
    
    let stopWhen = (stopperBroadcaster) => (broadcaster) => (listener) => {
      const stop = broadcaster(listener);
    
      stopperBroadcaster(() => {
        stop();
      });
    };
    
    stopWhen(buttonClick)(interval)(log);
  • 相关阅读:
    省市联级(DataReader绑定)
    中国六大最忙和六大最懒城市
    JavaScript极品小日历
    人生最重要的十个健康伴侣
    JavaScript 中的replace方法
    在VBScript中使用类
    使用嵌套触发器
    MM上街前的折腾(有趣)
    浅谈ASP中Web页面间的数据传递
    图片容错处理
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13751398.html
Copyright © 2020-2023  润新知