ข้อแตกต่างระหว่างObservable.of
และObservable.from
รูปแบบอาร์กิวเมนต์เท่านั้นหรือไม่ ชอบFunction.prototype.call
และFunction.prototype.apply
?
Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
ข้อแตกต่างระหว่างObservable.of
และObservable.from
รูปแบบอาร์กิวเมนต์เท่านั้นหรือไม่ ชอบFunction.prototype.call
และFunction.prototype.apply
?
Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
คำตอบ:
ไม่มาก เมื่อผ่านอาร์เรย์ไปที่Observable.from
ความแตกต่างเพียงอย่างเดียวระหว่างมันและObservable.of
เป็นวิธีการส่งผ่านข้อโต้แย้ง
อย่างไรก็ตามObservable.from
จะยอมรับข้อโต้แย้งนั่นคือ
วัตถุที่สามารถสมัครสมาชิกได้, สัญญา, Observable-like, Array, iterable หรือ object-like array ที่จะถูกแปลง
ไม่มีพฤติกรรมที่คล้ายกันObservable.of
ซึ่งมักยอมรับเฉพาะค่าและไม่ทำการแปลง
มันเป็นสิ่งสำคัญที่จะต้องทราบความแตกต่างระหว่างof
และfrom
เมื่อผ่านโครงสร้างเหมือนอาร์เรย์ (รวมถึงสตริง):
Observable.of([1, 2, 3]).subscribe(x => console.log(x));
จะพิมพ์ทั้งอาร์เรย์ในครั้งเดียว
ในทางกลับกัน,
Observable.from([1, 2, 3]).subscribe(x => console.log(x));
พิมพ์องค์ประกอบ 1 โดย 1
สำหรับสตริงการทำงานเหมือนกัน แต่ในระดับตัวอักษร
ข้อเท็จจริงที่น่าสนใจอีกข้อหนึ่งคือ Observable.of ([]) จะเป็นอาร์เรย์ว่างเมื่อคุณสมัครรับข้อมูล เมื่อคุณสมัครรับข้อมูลจาก Observable จาก ([]) คุณจะไม่ได้รับค่าใด ๆ
นี่เป็นสิ่งสำคัญเมื่อคุณทำการดำเนินการต่อเนื่องกับ 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())
....
หากไม่มีเว็บไซต์ที่จะบันทึกเช่น; data.length = 0 ในส่วน addSite โค้ดด้านบนนี้จะส่งคืน Observable.of ([]) จากนั้นไปที่บันทึกความคิดเห็น แต่ถ้าคุณแทนที่ด้วย Observable.from ([]) วิธีการที่สำเร็จจะไม่ถูกเรียกใช้
ความแตกต่างหนึ่งบรรทัด:
let fruits = ['orange','apple','banana']
จาก : ปล่อยรายการหนึ่งโดยหนึ่งในอาร์เรย์ ตัวอย่างเช่น
from(fruits).subscribe(console.log) // 'orange','apple','banana'
จาก : ปล่อยอาร์เรย์ทั้งหมดในครั้งเดียว ตัวอย่างเช่น
of(fruits).subscribe(console.log) // ['orange','apple','banana']
หมายเหตุ: ของ ผู้ประกอบการสามารถทำงานตามที่ได้จากผู้ประกอบการกับผู้ประกอบการแพร่กระจาย
of(...fruits).subscribe(console.log) // 'orange','apple','banana'
https://stackblitz.com/edit/typescript-sckwsw?file=index.ts&devtoolsheight=100
from
: สร้างสิ่งที่สังเกตได้จากอาเรย์สัญญาหรือทำซ้ำได้ รับค่าเดียวเท่านั้น สำหรับอาร์เรย์ iterables และ strings ค่าทั้งหมดที่มีจะถูกปล่อยออกมาเป็นลำดับ
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