RxJs来自vs的可观察对象

时间:2017-03-09 20:11:13

标签: javascript rxjs

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

一样
Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})

8 个答案:

答案 0 :(得分:122)

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

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

会立刻打印整个数组。

另一方面,

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

逐个打印元素。

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

答案 1 :(得分:69)

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

但是,Observable.from会接受argument

  

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

Observable.of没有类似的行为 - 它始终只接受值而不执行转换。

答案 2 :(得分:11)

一行差异:

       let fruits = ['orange','apple','banana']

来自:逐个发射数组中的项目。例如

    from(fruits).subscribe(console.log) // 'orange','apple','banana'

of :一次发射整个阵列。例如

 of(fruits).subscribe(console.log) //  ['orange','apple','banana']

注意:操作符可以与 操作符和扩展操作符

 of(...fruits).subscribe(console.log) //  'orange','apple','banana'

答案 3 :(得分:9)

另一个有趣的事实是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

答案 4 :(得分:5)

from:根据数组,promise或iterable创建可观察的对象。仅取一个值。对于数组,可迭代对象和字符串,所有包含的值将作为序列发出

const values = [1, 2, 3];
from(values); // 1 ... 2 ... 3

of:使用可变数量的值创建可观察值,按顺序发出值,但将数组作为单个值

const values = [1, 2, 3];
of(values, 'hi', 4, 5); // [1, 2, 3] ... 'hi' ... 4 ... 5

答案 5 :(得分:2)

from运算符获取事件源。 from(source)

let array = [1,2,3,4,5]
from(array); //where array is source of events, array[of events]


let promise = new Promise(function(resolve, reject) {
  // executor (the producing code, "singer")
});
from(promise); //where promise is source of event, promise(of event)





let observable = Observable.create(function(observer) {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  observer.next(4);
  observer.next(5);
  observer.complete();
});
from(observable); // where obsservable is source of events. 

of运算符进行一些偶然事件。 of(event1, event2, event3)

of(1,2,3,4,5); // where 1,2,3,4,5 are individual events

答案 6 :(得分:0)

  1. from按块(即一个接一个)返回通知。 例如:from(“ abcde”)将返回a => b => c => d => e
  2. of返回完整的通知。 例如:of(“ abcde”)将返回abcde。

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

答案 7 :(得分:0)

来自运营商可以接受其中之一

承诺 可迭代的 数组 可观察

from 从 observable 发出每个单独的项目,也可以进行转换。

of 运算符接收原始值并从 observable 中发出值。

import {from, Observable, of} from 'rxjs';

const ofObs = of([1,2,3]);
const fromObs = from([2,3,4]);

const basicObs = Observable.create(observer=>{
    observer.next(100);
    observer.next(200);
    observer.next(300);
})
const promise = new Promise((resolve,reject)=>{
    resolve(100);
})

const array = [1,2,3];
const iterbale  = "Dhana";

// const myObs = from(ofObs);//possible and can emit individual item value everytime 1, then ,2 , then 3
// const myObs = from(fromObs);//possbile and can emit individual item value everytime 1, then ,2 , then 3
// const myObs = from(basicObs);//possbile and can emit individual item value everytime 100, then ,200 , then 300
const myObs = from(promise);//possible can emit value 100
// const myObs = array(promise);//possible and can emit individual item value everytime 1, then ,2 , then 3
// const myObs = iterable(promise);//possible and can emit individual item value everytime D then h then a then n then a


myObs.subscribe(d=>console.log(d))



import {from, of} from 'rxjs';

const basicOf1 = of([1,2,3,4,5,6]) // emits entire array of events
const basicfrom1 = from([1,2,3,4,5,6]) //emits each event at a time

const basicOf2 = of(1,2,3,4,5,6) // emits each event at a time
// const basicfrom2 = from(1,2,3,4,5,6) //throws error
//Uncaught TypeError: number is not observable

const basicOf3 = of(...[1,2,3,4,5,6]) // emits each event at a time
const basicfrom3 = from(...[1,2,3,4,5,6]) //throws error
//Uncaught TypeError: number is not observable
basicOf3.subscribe(d=>console.log(d))

Here is the link to codepen