2017-07-26 51 views
0
this.http.get(validate\uniqueness).subscribe(unique => { 
     console.log(" first subscribe "); 
     if(unique.isValid) { 
      this.http.put(url, data).subscribe(val => { 
      console.log("second Subscribe") 
      } 
     }); 
    }); 

我们有一个自定义http微调器,当请求挂起时启动并在收到响应时停止。在第一次订阅调用的上述代码中,调用者被调用,并且一旦结果被检索并且页面在没有微调器的情况下被显示并且在调用微调器被再次调用第二次订阅时微调器就停止。我们可以在第一次通话和第二次通话之间进行一些延迟。有没有办法避免延迟?我已经使用mergeMap,flatMap但没有运气。Angular 2 - 链接http请求时避免延迟

回答

1

首先,你应该链中的http电话:

this.http.get(validate\uniqueness) 
    .map(req => req.json().unique) 
    .filter(unique => unique.isValid) 
    .switchMap(this.http.put(....)) 
    .subscribe(val => console.log(val)) 

但要么是不是要去解决您的问题。您在这里有两个单独的http请求,一个由另一个触发。这些请求之间总会有一些延迟。您可能可能会在微调停止之前添加延迟,从而允许后续请求“骑”相同的微调器。

我所做的加载指示是写我自己的rxjs operators

基本上,我的HTTP调用看起来像这样:

Observable.loadingDefer('name of loading state',() => { 
    // log or whatever 
    return this.http.get(...) 
}) 
.map(...) 
... 
.stopLoading('name of loading state') 
.subscribe(...) 

我有一个简单的服务,节省了Map<string, BehaviourSubject<boolean>>,这基本上是一个装载状态的名称之间的映射(在情况下,我想影响不同对象,并且没有一个全局加载状态)以及一个表明它是否正在加载的行为主题,默认为false。

Observable.loadingDefer使用Observable.defer,除了它使用的服务(这是作为一种单身出口,很像angular-redux's NgRedux),并声明加载状态。

stopLoading运营商使用finally运营商发送该指示的停止标志。这里我使用finally来解决请求失败的情况。

这对我来说已经够用了,但我认为它确实会在每个http呼叫周围留下一些样板。也许这是可以避免的。

希望它可以帮助你以某种方式:)

+0

感谢您的建议,明确微调被触发,以避免延迟 – user2810022

+0

你能标识V的答案吗?谢谢:)很高兴帮助! –