'of'vs'from'运算符

问题描述 投票:122回答:4

Observable.ofObservable.from参数格式之间的唯一区别是?像Function.prototype.callFunction.prototype.apply吗?

Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
rxjs
4个回答
89
投票

不完全是。将数组传递给Observable.from时,它与Observable.of之间的唯一区别是传递参数的方式。

但是,Observable.from将接受一个argument,即

要转换的可订阅对象,Promise,类似Observable的对象,数组,可迭代或类似数组的对象

Observable.of没有类似的行为-它始终仅接受值并且不执行任何转换。


152
投票

[在传递类似数组的结构(包括字符串)时,请注意offrom之间的区别很重要:

Observable.of([1, 2, 3]).subscribe(x => console.log(x));

将立即打印整个数组。

另一方面,

Observable.from([1, 2, 3]).subscribe(x => console.log(x));

按1打印元素。

对于字符串,行为是相同的,但是在字符级别。


12
投票

另一个有趣的事实是Observable.of([])订阅时将为空数组。就像当您订阅Observable.from([])一样,您将不会获得任何价值。

这在使用switchmap进行连续保存时很重要。例如:

.do((data) => {
            this.jobService.save$.next(this.job.id);
        })
        .switchMap(() => this.jobService.addSites(this.job.id, this.sites)
            .flatMap((data) => {
                if (data.length > 0) {
                    // get observables for saving
                    return Observable.forkJoin(jobSiteObservables);
                } else {
                    **return Observable.of([]);**
                }
            })).do((result) => {
            // ..
        })
        .switchMap(() => this.saveComments())
....

如果addSite部分中的data.length = 0,则上面的代码返回Observable.of([]),然后保存注释。但是,如果将其替换为Observable.from([]),后续的方法将不会被调用。

rxfiddle


0
投票
  1. 从头开始以块的形式返回通知。例如:from(“ abcde”)将返回a => b => c => d => e
  2. of返回完整的通知。例如:of(“ abcde”)将返回abcde。

https://stackblitz.com/edit/typescript-sckwsw?file=index.ts&devtoolsheight=100

© www.soinside.com 2019 - 2024. All rights reserved.