我想调用一个函数(同步),然后使用它的返回值作为初始发射(随后链接一些其他运算符上的结果可观察)。
我想在订阅期间调用这个函数,所以我不能只使用Observable。()=
我唯一能想到的是:
Observable.create((observer: Observer<void>) => {
let val = getSomeValue();
observer.next(val);
observer.complete();
})
我想正是这样。但对于一件简单的事情来说,这似乎太复杂了,它本应该是可以观察到的。fromFunction()=
实际上,我认为最好的选择是使用Observable。创建
,因为它是同步和异步初始值的最通用解决方案。
如果确定要使用同步函数,则可以使用startWith()
运算符(只有当getSomeValue()
的返回值对于所有观察者都应相同时,这才有意义)。
使用可观察。bindCallback
作为源代码的可观察性当然是可行的,但是我个人建议避免它,因为它会使代码很难理解,而且通常不需要,因为您可以只使用可观察性。创建
。
我在项目中使用的fromFunction$
的实现:
function fromFunction$<T>(factory: () => T): Observable<T> {
return Observable.create((observer: Subscriber<T>) => {
try {
observer.next(factory());
observer.complete();
} catch (error) {
observer.error(error);
}
});
}
用法如下:
fromFunction$(() => 0).subscribe((value) => console.log(`Value is '${value}'`), null, () => console.log('Completed'));
fromFunction$(() => [1, 2, 3]).subscribe((value) => console.log(`Value is '${value}'`), null, () => console.log('Completed'));
fromFunction$(() => { throw 'Something' }).subscribe(null, (error) => console.error(`Error: ${error}`));
给予:
Value is '0'
Completed
Value is '1,2,3'
Completed
Error: Something
直到这种实施存在。
我倾向于尽可能避免任何显式使用Observable.create
,因为通常它是一个错误的来源,不仅要管理您的事件发布,还要管理您的拆卸逻辑。
您可以使用Observable。改为推迟
。它接受一个函数,该函数返回一个可观察的
或一个可观察的类似
的东西(读:Promise、Array、Iterators)。因此,如果您有一个返回异步内容的函数,那么很容易:
Observable.defer(() => doSomethingAsync());
如果要使其与同步结果一起工作,请执行以下操作:
Observable.defer(() => Observable.of(doSomethingSync()));
注意:像create
一样,这将在每个订阅上重新运行该函数。这与可观察的结果不同。bindCallback
,它存储函数调用结果而不重新执行函数。因此,如果您需要这种行为,则需要使用适当的多播
操作符。
假设我有一个,它从网络获取数据并发出数据,如果我订阅这个observable,每次它试图从网络请求数据时,它会很重。 我想创建BehaviorSubject并将其连接到observableA,这样任何其他线程/对象都将订阅BehaviorSubject以获取最新发出的数据。 到目前为止,我还不能用它来编码。我不能创建空的BehaviorSubject并在observableA内调用,因为它们彼此不
我不知道如何从Observable中提取值,由Observable所在的函数返回。我只需要从中返回一个值,其他什么都不需要。 最新版本有效吗 我需要它工作,函数返回值,然后: 我做错了什么?
我正在尝试创建一个RxJava BlockingObservable,它将每隔X毫秒发出一个变量的值,直到(条件==true)或超时发生。 下面的代码似乎与我想要的很接近,但它总是发出一次,然后退出。奇怪的是,我在中有一个永远不会正确的条件——我希望这个可观察到的持续发出并最终超时,但事实并非如此。 我错过了什么/做错了什么?
我想创建一个作为源变量:。 我想创建一个可观察的,每次值更改时都会生成提要。 我是说,当我这样做的时候: 在我的代码的某个地方,我希望收到订阅的提要,等等。。。 有什么想法吗?
我试图理解当我使用 在或之后,在我使用时返回true 我知道是一次性的。isDisposed()返回false。有人能解释一下到底发生了什么吗?。我理解一个写得很好的观察。create不能在onComplete()或onError()之后发出项。
我对RxJs还比较陌生,我想了解与Rx结合使用Promises的最佳方式是什么。 我想要创建的是Angular中的一个服务,它的作用类似于事件分派器模式,一旦promise完成,就会发出一个事件。我还需要的是,如果没有(事件)订阅者,则永远不会调用可观察对象。我最不希望发生的事情是,observable的任何后续订户都会得到相同的结果,而不会触发对服务器的另一个请求。我在这里实现了自己的解决方案: