Как замедлить/подождать до вызова моего апи?

С Рождеством до вас.
Приложение 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.
но никакой результат для вызывающего абонента не установлен

Мой Наблюдатель, кажется, застрял.
и мне не повезло.


Мне хорошо известно, что это анти-шаблон в Angular "не дожидайтесь случайного числа", а не структурируйте приложение, так что вам не нужно. Мой фактический вариант использования заключался в том, что в HttpInterceptor мне нужен материал, который загружается другим Observable, обычно у меня нет проблем, только если пользователи обновляют конкретную страницу, у меня был риск того, что материал не был загружен.

Мое прямое обучение "быстрое исправление" было чертовски. Я делаю if, если и не загружен. Я жду некоторых ( "дайте ему время для загрузки" ), затем я продолжаю, кто заботится!, пользователь не обновит эту конкретную ссылку Angular довольно часто. Я закончил длинный путь, переместив все в config.ts и использую APP_INITIALIZER. Однако все же я хочу знать, как подождать некоторое время, если мне нравится ждать, следовательно, этот минимальный пример.

+18
источник поделиться
1 ответ

Не отчаивайтесь
Вместо этого здесь есть блики

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 будет задерживаться по умолчанию.

+6
источник

Посмотрите другие вопросы по меткам или Задайте вопрос