如何在调用我的 api 之前减慢/​​等待?

Posted

技术标签:

【中文标题】如何在调用我的 api 之前减慢/​​等待?【英文标题】:How to slow down / wait before call to my api? 【发布时间】:2018-06-04 07:52:54 【问题描述】:

祝你的朋友圣诞快乐。 我的 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。 但没有安装调用者的结果

我的 Observable 似乎卡住了。 我的运气快没了。


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

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

【问题讨论】:

我正要编辑你的问题,但后来我注意到这是一首歌曲 是的,只是一些乐趣,我很无聊,无论如何我希望如果我遗漏了一些信息,请告诉我 为什么要“放慢速度”?你想要实现什么(你的最终目标是什么)? 漂亮的节日问题格式 @Igor 这是一个最小化代码示例,最终目标是在调用 api 之前放慢速度,等待(我喜欢的时间)。 【参考方案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。

【讨论】:

这个解决方案对我有用,很好地使用默认值注入延迟,即使我的情况它会来自另一个类(注入),我希望你不介意我的小编辑只是为了保持圣诞精神:) 啊哈哈 ofc 不是 ;)

以上是关于如何在调用我的 api 之前减慢/​​等待?的主要内容,如果未能解决你的问题,请参考以下文章

如何在继续之前等待 requestLocation?

如何在koa发送HTTP响应之前等待url回调?

Blazor - 在 API 调用时显示等待或微调器

如何在单元测试之前等待组件的挂载回调中的异步调用完成?

如何仅减慢当前请求的速度? sleep() 没有按预期工作

在使用 redux-observables 开始另一个史诗之前,如何等待不同的史诗完成并更新商店?