Angular 5, как установить минимальную задержку (или тайм-аут)? - PullRequest
0 голосов
/ 28 октября 2018

Код запроса прост:

getItem() {
    return this.http
        .post<ItemModel>(`${this.apiUrl}/${methodUrl}`, {})
        .subscribe(response => {
            ...
        });
}

Существует два случая, в зависимости от того, как долго сервер будет обрабатывать запрос: мы получаем ответ sersponse менее чем за 1 минуту и ​​более чем за 1 минуту.

Мне нужно установить минимальную задержку на 1 минуту для первого случая, когда мы реагируем быстрее, быстрее, чем в течение 1 минуты.

Но я не могу просто добавить задержку ответа => {} вот так:

getItem() {
    return this.http
        .post<ItemModel>(`${this.apiUrl}/${methodUrl}`, {})
        .subscribe(response => {
            setTimeout(()=>{ ... }, timeoutValue)
            ...
        });
}

Поскольку в этом случае время задержки суммируется с временем отклика, например, если ответ 0,5 мин, а timeoutValue == 1 мин, мы будем ждать 1,5 мин. Мне нужно как-то установить общее время 1 мин.

Как мне это установить?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вы можете использовать forkJoin

getItem() {
 return this.http
     .post<ItemModel>(`${this.apiUrl}/${methodUrl}`, {})
     .subscribe(response => {
         ...
     });
}


getItemDelayed() {
    return forkJoin(
         getItem(),
         interval(1000).pipe(take(1))
    )
}

При этом каждое наблюдаемое будет выполняться параллельно, но результат будет отправлен только после того, как два будут завершены.

Так что если запрос займет меньшезатем одна секунда, результат придет через одну секунду.

0 голосов
/ 28 октября 2018

Использовать rxjs delay().

getItem() {
     return this.http
         .post<ItemModel>(`${this.apiUrl}/${methodUrl}`, {})
         .pipe(delay(60000)) // <- One min delay
         .subscribe(response => {
             ...
         });
 }
...