检测异步系统中的结束事件
Detect end event in async system
我正在用RxJS编写一些后端的东西。当一切都完成后,我需要提出一些事件。
1)建筑涉及Subject
onCompleted
所以事件永远不会自然发生。它可以手动发出,但要做到这一点,我需要依赖一些 END 事件,该事件...循环循环。
2)架构具有跟踪待处理任务的pending$
Observable
。不幸的是,由于系统的异步性质,这种状态可以被清空几次,所以它的"空"本身不能用作 END 指示器。
这是我的解决方案,这是一个相当黑客的解决方案,因为它需要明确的间隔常量。
import {Observable, Subject} from "rx";
let pendingS = new Subject();
let pending$ = pendingS
.startWith(new Set())
.scan((memo, [action, op]) => {
if (action == "+") {
memo.add(op);
return memo;
} else if (action == "-") {
memo.delete(op);
return memo;
} else {
return memo;
}
}).share();
let pendingDone$ = pending$ // a guess that
.debounce(2000) // if nothing happens within 2 sec window
.filter(pending => !pending.size); // and nothing is pending => we're done
pendingDone$.subscribe(function () {
console.log("pendingDone!");
});
setTimeout(function () {
pendingS.onNext(["+", "op1"]);
pendingS.onNext(["+", "op2"]);
pendingS.onNext(["+", "op3"]);
pendingS.onNext(["-", "op2"]);
pendingS.onNext(["-", "op1"]);
pendingS.onNext(["-", "op3"]);
}, 100);
setTimeout(function () {
pendingS.onNext(["+", "op4"]);
pendingS.onNext(["-", "op4"]);
}, 500);
这个(非常普遍的)问题有更优雅的解决方案吗?
到目前为止,我已经找到了 3 种通往 subj 的方法。
1) "空闲超时"
// next event
let pendingDone$ = pending$
.debounce(2000)
.filter(pending => !pending.size);
// next + completed events
let pendingDone$ = pending$
.filter(pending => !pending.size)
.timeout(2000, Observable.just("done"));
2)"同步设置,异步未设置"
如果挂起删除挂起到下一个事件循环迭代,则下一个挂起任务应在此之前,删除"挂起为空"时态条件。
pendingS.onNext(["+", "op"]);
// do something
setImmediate(() =>
pendingS.onNext(["-", "op"]);
);
pendingDone$
.filter(state => !state.size)
.skip(1); // skip initial empty state
3) 调度程序 (?
使用调度程序似乎可以实现类似的结果,但这可能是一种非常规的用法,所以我不打算深入研究这个方向。
相关文章:
- 处理第三方库发送的ajax请求的开始和结束事件
- 在触摸结束事件期间,Find元素手指处于打开状态
- 检测 iPhone 结束事件
- 无法从响应的结束事件中对 Http.Request 进行递归调用
- iOS7 野生动物园移动版|网页视频流 |未触发已结束事件
- 如何创建自定义事件来处理所有转换结束事件
- 有没有办法忽略某些基于 css 属性的转换结束事件
- 在 Firefox 中测试转换结束事件支持
- CSS 转换和转换结束事件的争用条件 - 找不到解决方案
- 转换结束事件未触发
- 模拟触摸开始和触摸结束事件
- 检测异步系统中的结束事件
- 将“结束”事件绑定到没有 ID 或类的声音播放
- 转换结束事件触发两次
- Node.js Http服务器,readstream结束事件两次触发console.log
- 我怎样才能浏览's”;束“;函数来发出结束事件
- 无论是否有请求的结束事件;这就是区别
- openlayer3捕获移动结束/缩放结束事件
- iPad1在视频播放结束之前启动视频结束事件
- 结束事件视频不工作