2017-01-15 13 views
10

निम्नलिखित कोड को देखते हुए, मैं प्रत्येक 500 मिलीसेकंड को दोहराने के लिए "एपीआई/फूओबर" अनुरोध प्राप्त करने के लिए इसे कैसे बदलूं?कोणीय 2 पर्यवेक्षकों के साथ मतदान कैसे करें

import {Observable} from "RxJS/Rx"; 
import {Injectable} from "@angular/core"; 
import {Http} from "@angular/http"; 

@Injectable() export class ExampleService { 
    constructor(private http: Http) { } 

    getFooBars(onNext: (fooBars: FooBar[]) => void) { 
     this.get("api/foobar") 
      .map(response => <FooBar[]>reponse.json()) 
      .subscribe(onNext, 
        error => 
        console.log("An error occurred when requesting api/foobar.", error)); 
    } 
} 
+0

मैंने यहां एक समान प्रश्न का उत्तर दिया http://stackoverflow.com/a/42659054/2398593 और बात यह है कि मैं 'अंतराल' का उपयोग नहीं कर रहा हूं क्योंकि यदि आपकी कॉल 500ms से अधिक लेती है तो दूसरे को निकाल दिया जाएगा। मेरा जवाब उस समस्या को हल करता है :) – Maxime

उत्तर

20

प्रयास करें सुनिश्चित करें कि आप आयात किया है आयात {नमूदार} 'rxjs/आरएक्स' से हम अगर हम इसे आयात नहीं करते हो नमूदार नहीं मिला त्रुटि कभी कभी

काम कर कर plnkr http://plnkr.co/edit/vMvnQW?p=preview

import {Component} from '@angular/core'; 
import {Http} from '@angular/http'; 
import 'rxjs/Rx'; 
import {Observable} from 'rxjs/Rx'; 

@Component({ 
    selector: 'app', 
    template: ` 
     <b>Angular 2 HTTP polling every 5 sec RxJs Observables!</b> 
     <ul> 
     <li *ngFor="let doctor of doctors">{{doctor.name}}</li> 
     </ul> 

     ` 
}) 

export class MyApp { 
    private doctors = []; 

    constructor(http: Http) { 
    Observable.interval(5000) 
    .switchMap(() => http.get('http://jsonplaceholder.typicode.com/users/')).map((data) => data.json()) 
     .subscribe((data) => { 
      this.doctors=data; 
      console.log(data);// see console you get output every 5 sec 
     }); 
    } 
} 
+0

आप अंतराल को कैसे रोकते हैं? यह हर 5 सेकंड में चलता रहता है और रुकता नहीं है। – GravyPlaya

+0

ngOnDestroy() लागू करें और घटकों पर अवलोकन योग्य सदस्यता –

+2

यह खतरनाक हो सकता है - यदि अनुरोध 5000 से अधिक समय ले रहे हैं, अगली बार स्विचमैप चलता है, तो यह पिछले अनुरोध को रद्द कर देगा। इस प्रकार यदि आपके सभी अनुरोध 5000 से अधिक समय ले रहे हैं, तो प्रत्येक व्यक्ति अगले को रद्द कर देगा, और आपको कोई मतदान नहीं मिलेगा। (5000 सुरक्षित होना चाहिए, लेकिन 500 बहुत छोटा होगा) –

-5

setInterval( क्यों नहीं आज़माएं)?

setInterval(getFooBars(), 500); 
+0

इस जवाब को वोट क्यों दिया गया था? मेरे जैसे पाठकों को दिलचस्पी होगी कि यह जवाब "बुरा" क्यों है। –

+4

इसे डाउनवॉटेड किया गया था क्योंकि यह एक नियमित अंतराल है जो देखने योग्य पैटर्न का उपयोग नहीं करता है, जबकि सवाल यह है कि अवलोकन के साथ मतदान (अंतराल) तंत्र का उपयोग कैसे करें। साथ ही, setInterval विधि का उपयोग करने से फ़ंक्शन getFooBars को प्रत्येक 500 एमएस को निष्पादित करने और आग लगाने के लिए लागू किया जाएगा, जिसे रद्द नहीं किया जा सकता है या नहीं, प्रतिक्रिया वापस आ गई है या नहीं। अवलोकन के साथ, एपीआई को निष्पादित किया जा सकता है जब एक ही एपीआई को फिर से निकाल दिया जाता है। – yaloumi

2

इस

return Observable.interval(2000) 
     .switchMap(() => this.http.get(url).map(res:Response => res.json())); 
+0

उत्तर के लिए धन्यवाद। ऐसा लगता है कि यह काम करेगा, साथ ही साथ। हालांकि, मुझे यह त्रुटि मिलती है: 'बहिष्करण: Observable_1.Observable.interval फ़ंक्शन नहीं है। मैं आरएक्सजेएस संस्करण 5-बीटा का उपयोग कर रहा हूं। क्या यह संस्करण 4 पर वापस रोलिंग संभव है इसे हल करेगा? –

+0

मुझे लगता है कि आप package.json फ़ाइल में कर सकते हैं –

0

मैं जो पेट rx-polling पुस्तकालय की सिफारिश ट्रैक्ट्स बहुत सारे विवरण रीट्रीज़, बैक-ऑफ रणनीतियों के लिए तंत्र प्रदान करते हैं, और ब्राउज़र टैब निष्क्रिय होने पर भी रोक/फिर से शुरू होते हैं।

संबंधित मुद्दे