[Javascript] Broadcaster + Operator + Listener pattern -- 18. Create a Win Condition with a mapDone Operator
JavaScript -- with create 18 win pattern Operator
2023-09-14 08:59:13 时间
Many streams of events end when a certain condition is met. When we run into that condition, we'll want to pass down our own custom values. This lessons walks through adding a done condition to hangman and how we can use new operators to control what happens when it's done.
Continue with previous post.
1. Set a win logic:
let hangman = pipe(map(hangmanLogic), applyOperator(word), stringConcat); hangman(inputValue)(log); // to let hangman = pipe(map(hangmanLogic), applyOperator(word), stringConcat); let play = hangman(inputValue); let winPipe = pipe(filter((str) => !str.includes("*"))); let win = winPipe(play); play(console.log); win(() => { console.log("you win"); });
When we enter 'honeycomb' in the input, it will log out 'you win', but as you continue typing, 'you win' continue pop up:
/* honeycomb you win honeycombb you win honeycombbbb you win */
2. doneCondition operator:
let hangman = pipe(map(hangmanLogic), applyOperator(word), stringConcat); let doneCondition = (condition) => (broadcaster) => (listener) => { let cancel = filter(condition)(broadcaster)((value) => { listener(done); cancel(); }); return () => { cancel(); }; }; let winPipe = pipe(doneCondition((str) => !str.includes("*"))); let play = hangman(inputValue); let win = winPipe(play); play(console.log); win(() => { console.log("you win"); });
Now, 'you win' only log out once.
3. Pass 'you win' from a operator:
let hangman = pipe(map(hangmanLogic), applyOperator(word), stringConcat); let doneCondition = (condition) => (broadcaster) => (listener) => { let cancel = filter(condition)(broadcaster)((value) => { listener(done); cancel(); }); return () => { cancel(); }; }; let mapDone = (doneValue) => (broadcaster) => (listener) => { broadcaster((value) => { if (value === done) { listener(doneValue); } }); }; let winPipe = pipe( doneCondition((str) => !str.includes("*")), mapDone("you win!") ); let play = hangman(inputValue); let win = winPipe(play); play(console.log); win(console.log);
4. Cancel 'play' when 'win':
let hangman = pipe(map(hangmanLogic), applyOperator(word), stringConcat); let doneCondition = (condition) => (broadcaster) => (listener) => { let cancel = filter(condition)(broadcaster)((value) => { listener(done); cancel(); }); return () => { cancel(); }; }; let mapDone = (doneValue) => (broadcaster) => (listener) => { broadcaster((value) => { if (value === done) { listener(doneValue); } }); }; let cancelWhen = (cancelBroadcaster) => (broadcaster) => (listener) => { let cancel = broadcaster(listener); let cancel2 = cancelBroadcaster(() => { cancel(); }); return () => { cancel(); cancel2(); }; }; let winPipe = pipe( doneCondition((str) => !str.includes("*")), mapDone("you win!") ); let play = hangman(inputValue); let win = winPipe(play); let rules = pipe(cancelWhen(win)); let playWithWin = rules(play); playWithWin(console.log); win(console.log);
相关文章
- javascript undefined_setvalidator
- javascript_JavaScript走向成熟
- [译] JavaScript -- Map vs ForEach
- 用javascript分类刷leetcode--位运算(图文视频讲解)
- JavaScript内置对象 | 数据类型
- 用javascript分类刷leetcode--双指针(图文视频讲解)
- 张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
- JavaScript滑移效果代码
- 不唐突的JavaScript的七条准则整理收集
- Javascript阻止javascript事件冒泡,获取控件ID值
- JavaScript克隆双重输入文字
- javascript学习笔记(二)js一些基本概念
- JavaScript获取当前页面上的指定对象示例代码
- Javascript中的回调函数和匿名函数的回调示例介绍
- javascript函数声明和函数表达式区别分析
- Javascript基础教程之JavaScript语法
- JavaScript的内存释放问题详解