ค้นหาเว็บไซต์

typescript - จะคืนค่าจากฟังก์ชันที่มีการสมัครสมาชิก Observable อยู่ข้างในได้อย่างไร?


ฉันไม่รู้วิธีดึงค่าจาก Observable เพื่อให้ฟังก์ชันที่มี Observable นั้นส่งค่ากลับมา ฉันต้องการเพียงค่าจากมันเพื่อส่งกลับมา ไม่มีอย่างอื่น

เวอร์ชันปัจจุบันที่ใช้งานได้

function getValueFromObservable() {
    this.store.subscribe(
        (data:any) => {
            console.log(data)
        }
    )
}
getValueFromObservable()

ฉันต้องการให้สิ่งนี้ทำงาน ฟังก์ชันต้องคืนค่า แล้วก็:

function getValueFromObservable() {
    this.store.subscribe(
        (data:any) => {
            return data
        }
    )
}
console.log(getValueFromObservable())

ฉันทำอะไรผิดตรงนี้หรือ?

คำตอบ #1

แก้ไข: อัปเดตโค้ดเพื่อสะท้อนการเปลี่ยนแปลงวิธีการทำงานของ pipe ในเวอร์ชันล่าสุดของ RXJS ตัวดำเนินการทั้งหมด (ในตัวอย่างของฉันคือ take) ตอนนี้ถูกห่อหุ้มอยู่ในตัวดำเนินการ pipe() แล้ว

ฉันตระหนักว่าคำถามนี้เป็นมานานแล้วและคุณคงมีวิธีแก้ปัญหาที่เหมาะสมในตอนนี้ แต่สำหรับใครก็ตามที่กำลังค้นหาสิ่งนี้ ฉันขอแนะนำให้แก้ไขด้วย Promise เพื่อคงรูปแบบแบบอะซิงค์ไว้

เวอร์ชันที่อธิบายละเอียดมากขึ้นคือการสร้าง Promise ใหม่:

function getValueFromObservable() {
    return new Promise(resolve=>{
        this.store.pipe(
           take(1) //useful if you need the data once and don't want to manually cancel the subscription again
         )
         .subscribe(
            (data:any) => {
                console.log(data);
                resolve(data);
         })
    })
}

ด้านผู้รับคุณจะต้อง "รอ" ให้คำสัญญา (promise) ถูกแก้ไขด้วยบางอย่างเช่นนี้:

getValueFromObservable()
   .then((data:any)=>{
   //... continue with anything depending on "data" after the Promise has resolved
})

วิธีที่เรียบง่ายกว่าจะเป็นการใช้ .toPromise() ของ RxJS แทน:

function getValueFromObservable() {
    return this.store.pipe(take(1))
       .toPromise()   
}

ฝ่ายที่รับยังคงเหมือนกับด้านบนแน่นอน

คำตอบ #2

นี่ไม่ใช่แนวคิดที่ถูกต้องแน่นอนในการใช้ Observable

ในคอมโพเนนต์คุณต้องประกาศสมาชิกของคลาสซึ่งจะเก็บวัตถุ (บางสิ่งที่คุณจะใช้ในคอมโพเนนต์ของคุณ)

export class MyComponent {
  name: string = "";
}

จากนั้น Service จะส่งกลับ Observable ให้คุณ:

getValueFromObservable():Observable<string> {
    return this.store.map(res => res.json());
}

Component ควรเตรียมตัวเองให้สามารถดึงค่าจากมันได้:

OnInit(){
  this.yourServiceName.getValueFromObservable()
    .subscribe(res => this.name = res.name)
}

คุณต้องกำหนดค่าจาก Observable ให้กับตัวแปร:

และเทมเพลตของคุณจะใช้ตัวแปร name:

<div> {{ name }} </div>

อีกวิธีหนึ่งในการใช้ Observable คือผ่าน async pipe http://briantroncone.com/?p=623

หมายเหตุ: หากนี่ไม่ใช่สิ่งที่คุณกำลังถาม กรุณาอัปเดตคำถามของคุณโดยระบุรายละเอียดเพิ่มเติม

บทความที่เกี่ยวข้อง