当前位置: 首页 > 知识库问答 >
问题:

如何从功能上创建可观察?

微生智刚
2023-03-14

我想调用一个函数(同步),然后使用它的返回值作为初始发射(随后链接一些其他运算符上的结果可观察)。

我想在订阅期间调用这个函数,所以我不能只使用Observable。()=

我唯一能想到的是:

Observable.create((observer: Observer<void>) => {
  let val = getSomeValue();
  observer.next(val);
  observer.complete();
})

我想正是这样。但对于一件简单的事情来说,这似乎太复杂了,它本应该是可以观察到的。fromFunction()=


共有3个答案

微生德运
2023-03-14

实际上,我认为最好的选择是使用Observable。创建,因为它是同步和异步初始值的最通用解决方案。

如果确定要使用同步函数,则可以使用startWith()运算符(只有当getSomeValue()的返回值对于所有观察者都应相同时,这才有意义)。

使用可观察。bindCallback作为源代码的可观察性当然是可行的,但是我个人建议避免它,因为它会使代码很难理解,而且通常不需要,因为您可以只使用可观察性。创建

郗学
2023-03-14

我在项目中使用的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

直到这种实施存在。

陆翰藻
2023-03-14

我倾向于尽可能避免任何显式使用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的任何后续订户都会得到相同的结果,而不会触发对服务器的另一个请求。我在这里实现了自己的解决方案: