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

typescript - Angular 2 - รอให้ boolean เป็น true ก่อนเรียกใช้ service


ฉันมีเมนูนำทางที่ใช้โมดูล ng2-page-scroll

ฉันเลื่อนผ่านหน้าโดยใช้ลิงก์แฮชแท็ก

ปัญหาคือ ถ้าฉันทำงานข้ามเส้นทาง ข้อมูลจะใช้เวลาบ้างในการโหลด ดังนั้นบริการจะเลื่อนไปยังส่วนของฉันก่อน จากนั้นข้อมูลทั้งหมดจึงโหลด และส่วนที่สนใจจะไม่อยู่บนหน้าจออีกต่อไป ดังนั้นผู้ใช้ต้องเลื่อนด้วยตนเองเพื่อไปยังส่วนที่สนใจ สิ่งนี้ทำให้เมนูทั้งหมดใช้งานไม่ได้

ดังนั้นฉันจึงใช้ EventEmitter ในทุกส่วน เพื่อกำหนดค่าบูลในหน้า "scrollable" ทุกอย่างเรียบร้อยดี...

แต่ฉันไม่รู้ว่าจะรอให้ค่าบูลีน allDataLoaded เป็นจริงอย่างไร

ฉันพยายามใช้พรอมิส

นี่คือวิธีที่โค้ดของฉันดูจนถึงตอนนี้

HTML ของส่วนประกอบเมนูนำทาง

<a [routerLink]="['']" [queryParams]="{ scrollTo: '#home' }">
<a [routerLink]="['']" [queryParams]="{ scrollTo: '#contact' }">
<a [routerLink]="['']" [queryParams]="{ scrollTo: '#about' }">

HTML ของคอมโพเนนต์ที่ใช้เซ็กเมนต์ราก

<componentOne (dataLoadedEvent)="homeLoaded = true; checkIfDataLoaded()"></componentOne>

TS ของส่วนประกอบที่ใช้ segment ราก

homeLoaded: boolean = false;
contactLoaded: boolean = false;
aboutLoaded: boolean = false;

allDataLoaded: boolean = false;

 ngOnInit() {
    // other code here
    this.route.queryParams.forEach((params: Params) => {
        if (params['scrollTo']) {
            this.checkIfDataLoaded().then(() => { 
                this.scrollToSection(params['scrollTo']);
            });
        }
    });
 }

checkIfDataLoaded() {
    if (this.homeLoaded && this.contactLoaded && this.aboutLoaded) {
        //this.allDataLoaded = true;
        return new Promise((resolve, reject) => {
            resolve(true);
        });
    }
}

ตามที่GünterZöchbauerตอบที่นี่ (https://stackoverflow.com/a/40126194/3264998) สำหรับคำถามอื่น รหัสจะส่งผลให้เกิดข้อผิดพลาด TypeError: Cannot read property 'then' of undefed

สรุป วิธีที่ถูกต้องในการใช้ promises เมื่อรอให้ตัวแปรบูลีนเปลี่ยนเป็น true/false คืออะไร?

คำตอบ #1

ปัญหาอยู่ในโค้ดของคุณ โดยเฉพาะในเมธอด checkIfDataLoaded() และไม่ได้เกิดจากที่คุณกำลังทำงานกับบูลีน

มันชัดเจนว่าจะเกิดข้อผิดพลาดเมื่อเงื่อนไขภายในประเมินค่าเป็น false เพราะว่าเมธอดนั้นจะคืนค่า undefined และดังนั้นการเรียก undefined.then(... จะทำให้เกิดข้อผิดพลาด

แน่นอนผมไม่รู้ว่า checkIfDataLoaded() ควรทำอะไรอย่างแน่นอน แต่ถ้าคุณต้องการต่อ .then() กับผลลัพธ์ของมัน มันก็ต้อง เสมอ คืนค่า Promise

อาจจะเป็นบางอย่างประมาณนี้:

checkIfDataLoaded() {
    return new Promise((resolve, reject) => {
        if (this.homeLoaded && this.contactLoaded && this.aboutLoaded) {
            // Whatever logic goes here
            resolve(true);
        } else {
            resolve(false);
        }
    });
}

ด้วยวิธีนี้ checkIfDataLoaded() จะส่งค่ากลับเป็น Promise เสมอ ในขณะที่ภายในสามารถทำอะไรก็ได้ตามที่คุณต้องการ