如何在Observable.forkJoin()中使用动态参数(urls)

时间:2016-04-07 04:35:28

标签: angular rxjs

所以我喜欢forkJoin,基本上是Promise.all的替代品,但我无法想象如何将它作为动态列表提供,如:

Observable.forkJoin(
        this.http.get('/app/books.json').map((res:Response) => res.json()),
        this.http.get('/app/movies.json').map((res:Response) => res.json())
    ).subscribe(
      data => {
        this.books = data[0]
        this.movies = data[1]
      },
      err => console.error(err)
    );

只是我需要在运行时创建http.gets(URL将不同,生成的目标和总URL都是动态的),尝试传递配置对象,但它不喜欢它... < / p>

tx用于阅读,

肖恩。

2 个答案:

答案 0 :(得分:4)

forkJoin将第一个参数作为

  

args(Arguments | Array):Observable序列或Promises的数组或参数,用于收集最后的元素。

所以,你可以简单地传递一个observable数组。 Here is a plunker

let observables = [
  this.http.get('/app/books.json').map((res:Response) => res.json()),
  this.http.get('/app/movies.json').map((res:Response) => res.json())
];

Observable.forkJoin(observables).subscribe(
   data => {
        this.books = data[0]
        this.movies = data[1]
   },
   err => console.error(err)
);

答案 1 :(得分:0)

我来到这里是为了寻找一种方法来识别一组动态组合的 observables 的结果。如果我传递一个 observables 数组,我不知道哪个结果会出现在哪个索引处,因为数组中 observables 的数量和顺序是未知的。

从 RxJS 6.5+ 开始,你可以将一个对象而不是一个数组传递给 ForkJoin,其中键将标识 observable,键的值是 observable(称为字典)。

// use some logic to dynamically assemble dictionary
const dictionary = {};

if (shouldGetBooks) {
   dictionary.books = this.http.get("/app/books.json");
}
if (shouldGetMovies) {
   dictionary.movies = this.http.get("/app/movies.json");
}

forkJoin(dictionary).subscribe((results) => {
   console.log(results); // { books: booksJson, movies: moviesJson }
});

现在可以通过密钥轻松识别结果。