2017-08-23 61 views
7

当我试图让通过在角4 HTTP服务多个HTTP请求, 以前的请求获得在Chrome取消(但他们到达服务器)。 例子:角4.一系列的HTTP请求被取消

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
obs1.subscribe(); 
obs2.subscribe(); // this will cancel obs1's http request 

但是如果我更换.subscribe().publish().connect()像上面,它会正常工作(不是抵消)

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
obs1.publish().connect(); 
obs2.publish().connect(); 

或者,如果我合并两个Observables为一,然后获得认购像上面,它也能正常工作

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
Observable.merge(obs1, obs2).subscribe() 

为什么我要面对这种行为?我需要了解,而不是绕过。我怎样才能让一系列请求没有合并,分叉等?

回答

6

我发现此行为的潜在原因。

感谢https://github.com/ghetolayhttps://github.com/dklmuc

我们发现,角将取消非常快的HTTP请求,其中没有任何回调。所以,你必须通过onNext在订阅

https://github.com/ghetolay:如果连接

确定它的竞争状态,我认为

它总是会调用xhr.abort()上拆卸

仍然被认为是由浏览器将关闭它打开,否则可能什么都不做

所以当你有响应的速度非常快的处理(如无回调是真的真的快)可以中止那些仍被视为开放连接

这一个正常工作:

for (let i = 1; i < 50; i++) { 
    http.get(`https://swapi.co/api/people/${i}`).subscribe((result) => { 
     console.log(i, result); 
    }); 
} 
+0

现在我感觉不好,因为我会有关发表评论,但只是假定你的例子进行了简化。如果你需要执行一个没有订阅的http请求。你可以调用'http.get(...)。take(1)'在获取第一个项目后订阅并销毁订阅。 – cgTag

+0

@ctTag是否需要(1)将调用请求事件而不订阅方法? – WimmDeveloper

+0

@ctTag不,它不会。现在检查。但是我刚刚意识到,对于HTTP方法非常合乎逻辑的使用'。取(1)' – WimmDeveloper

0

这与观测做被取消,尽管我必须承认,我不知道你面临的问题的根本原因。

我碰到一个类似的问题使用NGRX /效果模块。操作处理程序使用ngrx切换映射操作符向服务发出请求。除最后一个请求外的所有内容都将被取消将其更改为合并图解决了该问题。 以下是密码

@Effect() 
    loadSomeData$: Observable<Action> = this.actions$ 
      .ofType(SomeActions.Load_Data) 
      .mergeMap((id) => 
        this.someService.getSomething(id) 
          .map((someEntity) => new SomeActions.LoadDataSuccess(someEntity) 
          ).catch((x, y) => { 
            console.error('Error occured'); 
            return Observable.of(new SomeActions.LoadDataFailed(id)); 
          } 
          )); 

此处重现ngrx的相关部分。

https://www.learnrxjs.io/operators/transformation/switchmap.html

switchMap等平坦化操作符之间的主要区别是抵消效果。在每次排放中,先前的内部可观察值(您提供的函数的结果)被取消,并且新的可观察值被订阅。你可以通过切换到新的可观察值来记住这一点。