如何在致电我的api之前减速/等待?

时间:2017-12-21 15:44:29

标签: angular rxjs wait angular-http-interceptors angular-httpclient

圣诞快乐你的伴侣。
我的Angular 4应用程序不会等待。

我想在我打电话给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 但没有安装调用者的结果

My Observable似乎被卡住了 我运气不好

我很清楚这是Angular中的反模式“不要等待随机数”,而是构建你的应用程序,这样你就不需要了。我的实际用例是在HttpInterceptor我需要一些由其他Observable加载的东西,通常我没有麻烦,只有当用户刷新特定页面时我才有可能没有加载东西的风险。 / p>

我的直接教导“快速修复”是我发了一个if如果没有加载我等待一些(“给它时间加载”)然后我继续,谁在乎!用户不会经常刷新该特定的角度链接。我最终将所有内容移至config.ts并使用APP_INITIALIZER。但是,如果我想等待,我想知道如何等待一段时间,因此这个最小的例子。

1 个答案:

答案 0 :(得分:7)

不要绝望 相反,这里有一个眩光

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将是默认延迟。