[Javascript] Broadcaster + Operator + Listener pattern -- 12. Repeat a broadcaster that is DONE
JavaScript -- is 12 pattern that Operator listener
2023-09-14 09:00:46 时间
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(); });
相关文章
- javascript_JavaScript走向成熟
- 【说站】JavaScript对象原型__ proto__的介绍
- 用javascript分类刷leetcode--位运算(图文视频讲解)
- 杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法
- JavaScript学习总结(二十)——Javascript非构造函数的继承详解编程语言
- JavaScript学习总结(十七)——Javascript原型链的原理详解编程语言
- Javascript写入txt和读取txt文件示例详解编程语言
- javascript编程起步(第一课)
- 张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
- AJAX入门之深入理解JavaScript中的函数
- javascript生成/解析dom的CDATA类型的字段的代码
- Javascript更新JavaScript数组的uniq方法
- javascript天然的迭代器
- Javascript异步加载详解(浏览器在javascript的加载方式)
- javascript学习笔记(十四)window对象使用介绍
- javascript中使用正则表达式实现删除字符串中的前后空格
- JavaScript调用堆栈及setTimeout使用方法深入剖析
- 原生javascript和jquery判断浏览器版本等信息
- 利用noesis.Javascript开源组件.Net中执行javascript脚本
- javascript学习笔记--数字格式类型
- BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
- PHP和javascript常用正则表达式及用法实例
- 原生javascript实现图片弹窗交互效果