Observable.of
和Observable.from
参数格式之间的唯一区别是什么?与Function.prototype.call
和Function.prototype.apply
?
Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
答案 0 :(得分:122)
在传递类似数组的结构(包括字符串)时,注意of
和from
之间的区别非常重要:
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([])替换它,则不会调用后续方法。
答案 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)
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))