【发布时间】:2017-01-09 07:36:38
【问题描述】:
我遇到了takeUntil() 的一个非常奇怪的行为。我创建了一个可观察的计时器:
let finish = Observable.timer(3000);
那我等一会儿再打电话
// 2500 ms later
someObservable.takeUntil(finish);
我希望所说的 observable 在计时器“滴答”之后停止发射,即在它创建后大约 500 毫秒。实际上它在创建后持续发射 3000 毫秒,远远超过计时器“滴答”的那一刻。如果我使用包含绝对时间值的 Date 对象创建计时器,则不会发生这种情况。
这是设计使然吗?如果有,解释是什么?
这里是完整的代码,可以用 node.js 运行(它需要npm install rx):
let {Observable, Subject} = require("rx")
let start = new Date().getTime();
function timeMs() { return new Date().getTime() - start };
function log(name, value) {
console.log(timeMs(), name, value);
}
Observable.prototype.log = function(name) {
this.subscribe( v=>log(name,v),
err=>log(name, "ERROR "+err.message),
()=>log(name, "DONE"));
return this;
}
let finish = Observable.timer(3000).log("FINISH");
setTimeout( ()=>Observable.timer(0,500).takeUntil(finish).log("seq"), 2500);
这会生成以下输出:
2539 'seq' 0
3001 'FINISH' 0
3005 'FINISH' 'DONE'
3007 'seq' 1
3506 'seq' 2
4006 'seq' 3
4505 'seq' 4
5005 'seq' 5
5506 'seq' 6
5507 'seq' 'DONE'
如果我使用绝对时间创建计时器:
let finish = Observable.timer(new Date(Date.now()+3000)).log("FINISH");
然后它按预期运行:
2533 'seq' 0
3000 'seq' 'DONE'
3005 'FINISH' 0
3005 'FINISH' 'DONE'
这种行为在各种情况下似乎相当一致。例如如果您使用mergeMap() 或switchMap() 间隔并创建子序列,结果将是相似的:子序列在完成事件之后继续发射。
想法?
【问题讨论】:
标签: javascript rxjs