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

angular - เรียกฟังก์ชันทุก ๆ 10 วินาที Angular2


ฉันกำลังพยายามสร้าง Timer ที่เรียก API call ทุก 10 วินาที ฉันใช้ setTimeOut แต่ปัญหาคือมันกลายเป็นลูปไม่สิ้นสุด และแม้ว่าฉันจะไปยังหน้าอื่น มันก็ยังคงเข้าร่วมเงื่อนไข if

ตัวอย่าง :

ฉันเรียกใช้วิธีนี้เพื่อเริ่มการเรียก API เป็นเวลา 10 วินาที

setTimeout(() => {
    this.onTimeOut();
}, 1000);

และนี่คือเมธอด onTimeOut()...

onTimeOut() {
    this.ApiCall().then(
    success => {
    if(success ['ok'] == 0){
        this.navCtrl.push(myPage);
    }
    },
    error => { console.log(error); });
}
setTimeout(() => {
    this.onTimeOut();
}, 1000);
}

ฉันเคยได้ยินเกี่ยวกับ Debounce และ rxjs/rs แต่ฉันไม่คุ้นเคยกับมัน คุณช่วยให้คำแนะนำหน่อยได้ไหมว่าจะทำแบบเดียวกันนี้ได้อย่างไร? หรือถ้าวิธีนี้มีประสิทธิภาพมากกว่าก็โปรดอธิบายให้ฉันฟังว่าทำไมมันถึงกลายเป็นลูป

เป้าหมายคือเมื่อต่อกับ if และกดหน้าจะหยุดตัวจับเวลา

คำตอบ #1

ควรใช้ observables จะดีกว่า

this.sub = Observable.interval(10000)
    .subscribe((val) => { console.log('called'); });

เพื่อหยุดมัน ใช้

this.sub.unsubscribe();

ตรวจสอบให้แน่ใจว่าได้นำเข้า interval ด้วย

import 'rxjs/add/observable/interval';

คำตอบ #2

จาก RxJS 6+ คุณเพียงแค่ใช้ interval.

import { interval } from 'rxjs';

//in 10 seconds do something
interval(10000).subscribe(x => {
    this.myFunctionThatDoesStuff();
});

คุณสามารถใช้ Subscription กับช่วงเวลาได้

import { interval, Subscription} from 'rxjs';
export class intervalDemo{
    mySubscription: Subscription

    constructor(){
    this.mySubscription= interval(5000).subscribe((x =>{
                this.doStuff();
            }));
    }
    doStuff(){
        //doing stuff with unsubscribe at end to only run once
        this.failedRequestSub.unsubscribe();
    }
}

คำตอบ #3

วิธีแก้ปัญหาที่ดีกว่าการใช้ setTimeout ในแอป Angular อาจเป็นการใช้ Observable Observable มีเมธอดที่ชื่อว่า timer ที่คุณสามารถใช้ได้ในลักษณะนี้ (และมี TimerObservable ด้วยแต่ผมไม่เคยใช้มันเลยจึงไม่รู้ว่ามันเหมือนกันหรือไม่):

timer = Observable.timer(initialDelay, period);

timer.subscribe(tick => {
   // Your API call, which will be performed every period
});

ฉันสนับสนุนให้คุณใช้ RxJS และ Observable สำหรับคำร้องของคุณด้วย แทนที่จะใช้ promises มันดูเหมือนวิธีที่ Angular จะทำสิ่งต่าง ๆ สำหรับฉัน และ RxJS เป็นไลบรารีที่ทรงพลังจริงๆ

เอกสาร RxJS Observable

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