2016-11-14 83 views
0

我有一個嵌套的forkjoin的問題,當我嘗試訂閱拉,它回來我的數據,但我可以看到,getitem3仍在運行。如何要等到所有的功能都完成之前,訂閱如何等待嵌套forkjoin完成?

見例如

pull(id) { 
    return Observable.forkJoin(
    this.getitem1(id), 
    this.getitem2(id), 
    this.getitem3(id) 
); 
} 



getitem3(id) { 
    let url = 'https://host3/get/' + id; 
    let observableBatch = []; 

    return this.http.get(url).map(res => res.json()).map(data => { 
    data.posts.data.forEach((item) => { 
     observableBatch.push(this.getImageUrl(item.id)); 
    }) 
    return Observable.forkJoin(observableBatch); 
    }) 
} 


getitem2(id) { 
    let url = 'https://host2/get/' + id; 
    let observableBatch = []; 

    return this.http.get(url).map(res => res.json()).map(data => { 
    data.posts.data.forEach((item) => { 
    observableBatch.push(this.getImageUrl(item.id)); 
    }); 
    return Observable.forkJoin(observableBatch); 

    }); 
} 

getitem1(id) { 
    let url = 'https://host1/get/' + id; 
    let observableBatch = []; 

    return this.http.get(url).map(res => res.json()).map(data => { 
    data.posts.data.forEach((item) => { 
     observableBatch.push(this.getImageUrl(item.id)); 
    }); 
    return Observable.forkJoin(observableBatch); 
    }); 
} 

getImageUrl(id) { 
    let url = 'https://localhost/image/' + id; 
    return this.http.get(url).map(res => res.json()).map(data => { 
    console.log('done'); 
    }); 
} 
+0

在'getImageUrl(id)'方法中,您使用'subscribe',因此它調用了url。刪除'subscribe'(所以它會返回一個可觀察的)並重試。 – echonax

+0

我更改了訂閱地圖。我必須在我的getItem中訂閱它嗎? – kabus

+0

不,你應該訂閱'拉(id)'方法,如果這是你唯一需要的。 – echonax

回答

2

我覺得你的方法getitemN()返回Observable <Observable<any>>。當你訂閱你剛剛打電話給第一個可觀察到的人時,你可以使用flatMap而不是map

.flatMap(data => { 
       data 
        .posts 
        .data 
        .forEach((item) => { 
         observableBatch.push(this.getImageUrl(item.id)); 
        }) 
       return Observable.forkJoin(observableBatch); 
      }) 

因此,在這種情況下,你將只得到Observable <any>

這裏是有用的信息:http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http。 FlatMap位於「從屬電話」部分。

+0

我無法對主要問題添加評論。 .map(data => {console.log('done');})。在這裏你不會返回數據,所以在訂閱者你什麼也得不到。如果你想編寫一些副作用,如登錄到控制檯,你可以使用do()方法。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/do.md – Nikolai

+0

謝謝你,那正是我需要的。它現在按預期工作。 – kabus