Angular5 如何设置最小延迟(或超时)?

Angular 5 how to set minimal delay (or timeout)?

请求代码很简单:

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

有两种情况取决于服务器处理请求的时间:我们在不到 1 分钟和超过 1 分钟内收到响应。

当我们快速接收响应时,我需要为第一个案例设置最小延迟 1 分钟,然后在 1 分钟内更快。

但我不能像这样简单地添加响应延迟 => {}:

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

因为在这种情况下,延迟时间与响应时间相加,例如,如果响应 0.5 分钟且 timeoutValue == 1 分钟,我们将等待 1.5 分钟。我需要以某种方式将最短总时间设置为 1 分钟。

如何设置?

使用 rxjs delay().

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

你可以使用 forkJoin

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


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

有了这个,每个可观察对象都将并行执行,但只有在两个都完成后才会发送结果。

所以如果请求不到一秒,结果将在一秒内到达。