2017-05-24 29 views
0

什么会导致个人subscribe触发,但forkJoin不触发?RxJS - forkJoin何时触发?

我发送了一个触发subject.subscribe的请求,但是当我将它添加到数组以便与forkJoin一起使用时,forkJoin().subscribe不会运行。返回的结果是一个对象。

let responses$ = []; 
    _.map(items, (item) => { 
     let subject = new Subject(); 
     this.apiService.postRequest("/api/my-endpoint", data).subscribe(subject); 
     responses$.push(subject); 
     subject.subscribe((res) => { console.log("this triggers") }); 
    }); 

    Observable.forkJoin(responses$).subscribe((res) => { 
     console.log("this does not trigger"); 
    }); 

这里是postRequest - 我不确定我做得对不对,我想链接它像承诺。

public postRequest(url: string, data: any) { 
    return this.getToken().flatMap((accessToken: Response) => { 
     return this.post(url, data, {'Authorization': 'Bearer ' + accessToken}); 
     }); 
} 

坦白说,我只是想做类似$q.all与承诺的东西。

回答

1

forkJoin将发出一个数组,其中包含传递给它的每个观察值的最后一个值。当所有观察结束时,它会发出数组。

因此,传递给它的每个observable都需要发出至少一个值,并且还需要完成。

您订阅加入的observable不会触发的原因很可能是因为observables尚未完成。您尚未在问题中包含getToken()的实施,但除非该可观察项完成,否则forkJoin既不会发出任何值也不会完成。

你可以确保通过在postRequest执行使用first()完整的观测:

public postRequest(url: string, data: any) { 
    return this.getToken() 
    .first() 
    .flatMap((accessToken: Response) => { 
     return this.post(url, data, {'Authorization': 'Bearer ' + accessToken}); 
    }); 
} 
+0

谢谢。我研究了getToken(),并且我正在创建一个新的Observable,但不触发'onComplete()'。 – riyuyu