Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在URL请求后订阅Observable_Angular - Fatal编程技术网

Angular 在URL请求后订阅Observable

Angular 在URL请求后订阅Observable,angular,Angular,请原谅我的行话,如果我没有使用正确的主题和观察词汇 无论如何,我想做的是在订阅新图片时获得一个图片列表。当前在控制台中,我的响应是 [] [3] [7] [9] 其中,每个数字都是数组的长度。这是正确的。9是正确的长度数组,我正在获取图像列表 但是!我只想把控制台打印出来[9]。我不知道为什么我订阅了4次 我如何延迟订阅直到forEach循环完成,这样我就不会多次订阅 我担心在HTML组件中显示图像时可能会遇到问题 export class ViewComponent implements On

请原谅我的行话,如果我没有使用正确的主题和观察词汇

无论如何,我想做的是在订阅新图片时获得一个图片列表。当前在控制台中,我的响应是

[]

[3]

[7]

[9]

其中,每个数字都是数组的长度。这是正确的。9是正确的长度数组,我正在获取图像列表

但是!我只想把控制台打印出来[9]。我不知道为什么我订阅了4次

我如何延迟订阅直到forEach循环完成,这样我就不会多次订阅

我担心在HTML组件中显示图像时可能会遇到问题

export class ViewComponent implements OnInit {

  constructor(private data: Masterdata) {   }

  ngOnInit() {
    this.data.currentMessage.subscribe(message => this.message = message);
  }

  getBabies() {
    this.data.getBabiesById().subscribe(
      data => {
      this.BabiesRooms = data;

      data.forEach((element) => {
        this.data.getImagesByBabyId(String(element.idbabyroom)).subscribe();
      });
      });

    console.log("ASDF");
      this.data.newImages.subscribe(data => console.log(data));

  }
}
编辑:让我重新措辞一下。方法getBabies()中有两个订阅


我只希望在第一个订阅完成后调用第二个订阅

基本上,您可以使用
rxjs
forkJoin。使用映射将列表存储在数组中,而不是
forEach
。下面是你应该尝试的方法

  let someVar = data.map((element) => {
     return this.data.getImagesByBabyId(String(element.idbabyroom));
    });
  });

 const result = forkJoin(someVar)
       .subscribe(res => {
    // Here you will get the result in the form of array
    // such as
    // console.log(res[0], 'res[0]') is first res of subscription stored in array and so on...
    // console.log(res[1], 'res[1]')
    // console.log(res[res.length - 1]) // to get the last item
  })

有关

的详细信息,您可以使用forkjoin实现:

Observable.forkJoin(
  this._myService.makeRequest('Request One', 2000),
  this._myService.makeRequest('Request Two', 1000),
  this._myService.makeRequest('Request Three', 3000)
)
.subscribe(([res1, res2, res3]) => {
  this.propOne = res1;
  this.propTwo = res2;
  this.propThree = res3;
});
您还可以使用Rxjs flatMap执行相同的操作:

import { switchMap } from 'rxjs/operators';
getBabies() {
    return this.data.getBabiesById().do(response => {
        // do something with above response
        this.BabiesRooms = response;
    }).flatMap(response => {
        response.forEach((element) => {
            this.data.getImagesByBabyId(String(element.idbabyroom)).subscribe();
        });
    })


}

与其循环查看
数据
,为什么不直接获取
数据[data.length-1]
?这样每个IDBAByROM都会进行一个单独的URL调用。好的,那么您想进行所有调用,但只关心最终的响应?正确。所以我非常希望在调用第二个订阅之前完成第一个订阅。