2016-11-14 2 views
0

У меня проблема с вложенным forkjoin, когда я пытаюсь подписаться на pull, он возвращает мои данные, но я вижу, что 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

Нет, вы должны подписаться на метод 'pull (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');}). Здесь вы не возвращаете данные, так что у абонента вы ничего не получаете. Если вы хотите написать код с некоторыми побочными эффектами, такими как log to console, вы можете использовать метод do(). https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/do.md – Nikolai

+0

Спасибо, человек, это именно то, что мне нужно. Сейчас он работает так, как ожидалось. – kabus

Смежные вопросы