祝你的朋友圣诞快乐。
我的Angular 4应用程序将不会等待。
我想在调用api之前放慢速度。
但我只是继续碰壁。
我在代码中使用了httpinterceptor。
但这些可观测到的东西会爆炸。
不要受到太多的轻蔑。
下面是我的尝试。
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
中,我需要一些由其他可观察的内容加载的内容,通常情况下,我没有问题,只有当用户刷新特定页面时,我才有没有加载内容的风险。我直接教的“快速修复”是我做了一个如果没有加载我等待一些(“给它时间加载”)然后我继续,谁在乎!用户不会经常刷新特定的角度链接。最后我走了很长一段路,全部移到a
config.ts
并使用APP_INITIALIZER
。但是,如果我想等待,我仍然想知道如何等待一段时间,因此这个最小的例子。 最佳答案
不要绝望
相反,这里有一个眩光
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。关于angular - 如何减慢速度/等待调用我的api?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47928307/