18

मेरी क्रिसमस आपसे मिलती है।
मेरा कोणीय 4 ऐप इंतजार नहीं करेगा।मेरे एपीआई को कॉल करने से पहले धीमा/प्रतीक्षा कैसे करें?

मैं एपीआई कॉल से पहले धीमा करना चाहता हूं।
लेकिन मैं अभी एक दीवार हिट करना जारी रखता हूं।

मैं अपने कोड में एक HttpInterceptor का उपयोग कर रहा हूँ।
लेकिन ये पर्यवेक्षक बस विस्फोट करेंगे।

बहुत अधिक अवमानना ​​न पाने के लिए। नीचे दिए गए
आपको मेरा प्रयास मिल जाएगा।

export class ApiUrlInterceptor implements HttpInterceptor { 

    constructor(private http: Http) { } 

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     return Observable.create(observer => { 
      setTimeout(() => { 
       observer.next(true); //Not sure why I do this 
       const start = Date.now(); 
       console.log(`Request for ${req.url}`); 
       return next.handle(req).do(event => { 
        if (event.type == HttpEventType.Response) { 
         const elapsed = Date.now() - start; 
         console.log(`Request for ${req.urlWithParams} took ${elapsed} ms.`); 
        } 
       }); 
      }, 1000); 
     }); 
    } 
} 

परिणाम यह है कि एपीआई कहा जाता है।
लेकिन कॉलर को कोई परिणाम नहीं मिला

मेरा अवलोकन करने योग्य लगता है।
और मैं भाग्य से बाहर भाग रहा हूं।


मुझे अच्छी तरह पता है कि इस कोणीय में एक विरोधी पैटर्न ताकि आप की जरूरत नहीं है, "एक यादृच्छिक संख्या के लिए इंतजार नहीं है" के बजाय अपने आवेदन की संरचना है हूँ। मेरा वास्तव में उपयोग का मामला यह था कि HttpInterceptor में मुझे कुछ सामानों की आवश्यकता होती है जो अन्य अवलोकन योग्य द्वारा लोड की जाती हैं, आमतौर पर मुझे परेशानी नहीं होती है, केवल तभी जब उपयोगकर्ता किसी विशेष पृष्ठ को रीफ्रेश करते हैं तो मुझे जोखिम था कि सामान लोड नहीं किया गया था।

मेरा सीधा सिखाया गया "त्वरित फिक्स" बिल्ली था अगर मैं लोड करता हूं और अगर लोड नहीं होता है तो मैं कुछ ("इसे लोड करने का समय दें") इंतजार करता हूं, तो मैं आगे बढ़ता हूं, कौन परवाह करता है !, उपयोगकर्ता उस विशेष कोणीय लिंक को ताज़ा नहीं करेगा । मैंने लंबे समय तक सभी को config.ts पर ले जाया और APP_INITIALIZER का उपयोग किया। हालांकि मैं अभी भी जानना चाहता हूं कि अगर मुझे प्रतीक्षा पसंद है तो कुछ समय इंतजार करना है, इसलिए यह न्यूनतम उदाहरण है।

+4

मैं आपके प्रश्न को संपादित करने जा रहा था, लेकिन फिर मैंने देखा कि यह एक प्रकार का गीत था –

+0

हाँ बस कुछ मजेदार है, मैं ऊब गया हूं, वैसे भी मुझे आशा है कि अगर मुझे कुछ जानकारी याद आ रही है तो मुझे यह पता चल जाएगा कि –

+0

क्यों करें आप इसे "धीमा करना" चाहते हैं? आप क्या हासिल करने की कोशिश कर रहे हैं (आपका अंतिम लक्ष्य क्या है)? – Igor

उत्तर

6

निराशा नहीं
इसके बजाय यहां क्या एक चमक

import { timer } from 'rxjs/observable/timer'; 
// or import { TimerObsevable } from 'rxjs/observable/TimerObsevable'; 

export class PreRequestDelayInterceptor implements HttpInterceptor { 

    constructor(@Inject(PRE_REQUEST_DELAY)@Optional() private delay = 1000) { } 

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     const delay = timer(this.delay); 
     const start = Date.now(); 
     return delay.switchMap(()=> next.handle(req)) 
     .do(event => { 
      if (event.type == HttpEventType.Response) { 
       const elapsed = Date.now() - start; 
       console.log(`Request for ${req.urlWithParams} took ${elapsed} ms.`); 
      } 
     }); 
    } 
} 

है एक InjectionToken का उपयोग कर आप एक निश्चित देरी इंजेक्षन सकता है। यदि कोई भी प्रदान नहीं किया गया है, तो 1000 डिफ़ॉल्ट देरी होगी।

+1

यह समाधान मेरे लिए काम करता है, डिफ़ॉल्ट मूल्य के साथ देरी इंजेक्शन करने के लिए अच्छा स्पर्श, भले ही मेरा मामला यह किसी अन्य वर्ग (इंजेक्शन) से पहुंचा होगा, मुझे आशा है कि क्रिसमस की भावना को बनाए रखने के लिए मुझे मेरा मामूली संपादन नहीं लगेगा :) –

+0

आह की नहीं;) –

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