18

메리 크리스마스에 친구.
내 Angular 4 앱을 기다릴 수 없습니다.내 API를 호출하기 전에 속도를 줄이거 나 기다리는 방법은 무엇입니까?

내가 API를 호출하기 전에 속도를 줄이려고합니다.
하지만 벽을 치기를 계속합니다.

내 코드에서 HttpInterceptor를 사용하고 있습니다.
하지만 Observable은 폭발 할 것입니다.

너무 경멸하지 마세요.
아래에서 내 시도를 볼 수 있습니다.

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); 
     }); 
    } 
} 

결과로 API가 호출됩니다.
발신자에게 결과가 없습니다.

내 관찰 가능이 고착 된 것 같습니다.
나는 운이 다가오고 있습니다.


나는 이것이 당신이 필요가 없습니다 대신 응용 프로그램을 구성, "임의의 번호를 기다리지 않는다"각도에서 안티 패턴 것을 잘 알고 있어요. 사실 내 사용 사례는 HttpInterceptor입니다. 다른 Observable에 의해로드 된 일부 물건이 필요합니다. 일반적으로 사용자가 특정 페이지를 새로 고칠 때만 문제가 발생하지 않습니다. 물건을로드하지 않을 위험이 있습니다.

내 직접 가르쳐 준 "빠른 수정"은 내가 지어낸 것일 수도 있고로드하지 않은 경우 일부를 대기 ("로드 할 시간을줍니다") 한 다음 계속 진행할 수 있습니다. 사용자가 자주 특정 각도의 링크를 새로 고치지 않습니다. . 나는 먼 길을 모두 config.ts으로 옮기고 APP_INITIALIZER을 사용했다. 그러나 나는 잠시 기다리는 방법을 알고 싶다. 그러므로 최소한의 시간을 기다려야한다.

+4

나는 당신의 질문을 편집 할 예정 이었지만, 나는 그것이 일종의 노래라고 생각했다. –

+0

그래, 그냥 재미있어, 지루해. 어쨌든 나는 약간의 정보가 빠진다면 분명히 희망한다. –

+0

왜 당신은 "천천히"하고 싶습니까? 무엇을 달성하려고합니까 (최종 목표는 무엇입니까?) – Igor

답변

6

는 고정 된 지연을 주입 할 수있는 InjectionToken를 사용하여 눈부심

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.`); 
      } 
     }); 
    } 
} 

이 대신 여기 절망을
를 수행합니다. 아무 것도 제공되지 않으면 1000이 기본 지연이됩니다.

+1

이 솔루션은 저에게 효과적입니다. 기본 값으로 지연을 주입하는 멋진 터치입니다. 제 경우에는 다른 클래스 (주입 됨)에서 도착했을지라도 크리스마스 정신을 유지하기 위해 사소한 편집을 염두에 두지 마십시오. –

+0

ahhah ofc 아닙니다;) –