'ของ' vs 'จาก' โอเปอเรเตอร์


153

ข้อแตกต่างระหว่างObservable.ofและObservable.fromรูปแบบอาร์กิวเมนต์เท่านั้นหรือไม่ ชอบFunction.prototype.callและFunction.prototype.apply?

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

คำตอบ:


115

ไม่มาก เมื่อผ่านอาร์เรย์ไปที่Observable.fromความแตกต่างเพียงอย่างเดียวระหว่างมันและObservable.ofเป็นวิธีการส่งผ่านข้อโต้แย้ง

อย่างไรก็ตามObservable.fromจะยอมรับข้อโต้แย้งนั่นคือ

วัตถุที่สามารถสมัครสมาชิกได้, สัญญา, Observable-like, Array, iterable หรือ object-like array ที่จะถูกแปลง

ไม่มีพฤติกรรมที่คล้ายกันObservable.ofซึ่งมักยอมรับเฉพาะค่าและไม่ทำการแปลง


193

มันเป็นสิ่งสำคัญที่จะต้องทราบความแตกต่างระหว่าง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 (1, 2, 3) .subscribe (x => console.log (x));
xiaoke

1
@xiaoke แน่นอนว่ามันคือ 3 การปล่อยที่แยกกัน (1 จากนั้น 2 จากนั้น 3)
Tsvetan Ovedenski

16

ข้อเท็จจริงที่น่าสนใจอีกข้อหนึ่งคือ 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 ([]) วิธีการที่สำเร็จจะไม่ถูกเรียกใช้

rxfiddle


6

ความแตกต่างหนึ่งบรรทัด:

       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'

3
  1. จากการแจ้งเตือนการคืนสินค้าเป็นชิ้น ๆ หนึ่งต่อหนึ่ง สำหรับเช่น: จาก ("abcde") จะส่งคืน a => b => c => d => e
  2. ของการแจ้งเตือนผลตอบแทนที่สมบูรณ์ สำหรับเช่น: ของ ("abcde") จะส่งคืน abcde

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


0

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.