gpt4 book ai didi

javascript - 检查是否未完成 Observable 是否为空

转载 作者:搜寻专家 更新时间:2023-10-30 20:56:16 26 4
gpt4 key购买 nike

有没有好的方法来检查未完成的 Observable 在那个确切时间是否为空?

let cache = new ReplaySubject<number>(1);
...
// Here I want to know if 'cache' still empty or not. And, for example, fill it with initial value.
cache.isEmpty().subscribe(isEmpty => {
if (isEmpty) {
console.log("I want to be here!!!");
cache.next(0);
}
});
// but that code does not work until cache.complete()

最佳答案

其实并没有那么简单,公认的答案也不是很普遍。您想要检查 ReplaySubject 在这个特定时间点是否为空。

但是,如果你想让它真正与 ReplaySubject 兼容 你还需要考虑指定 windowTime 参数通过此对象的每个值的“生存时间”。这意味着您的缓存是否为空会及时改变

ReplaySubject 有方法 _trimBufferThenGetEvents那做你需要的。不幸的是,此方法是私有(private)的,因此您需要在 JavaScript 中进行一些“修改”并直接扩展其 prototype

import { ReplaySubject } from 'rxjs';

// Tell the compiler there's a isNowEmpty() method
declare module "rxjs/ReplaySubject" {
interface ReplaySubject<T> {
isNowEmpty(): boolean;
}
}

ReplaySubject.prototype['isNowEmpty'] = function() {
let events = this._trimBufferThenGetEvents();
return events.length > 0;
};

然后使用这个 ReplaySubject 很简单:

let s = new ReplaySubject<number>(1, 100);
s.next(3);
console.log(s.isNowEmpty());
s.next(4);

setTimeout(() => {
s.next(5);
s.subscribe(val => console.log('cached:', val));
console.log(s.isNowEmpty());
}, 200);

setTimeout(() => {
console.log(s.isNowEmpty());
}, 400);

请注意,某些对 isNowEmpty() 的调用返回 true,而其他调用则返回 false。例如,最后一个返回 false,因为该值同时无效。

这个例子打印:

true
cached: 5
true
false

查看现场演示:https://jsbin.com/sutaka/3/edit?js,console

关于javascript - 检查是否未完成 Observable 是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41585968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com