Angular Looped HTTP 请求将值映射到响应

标签 angular http asynchronous rxjs observable

在我的服务类中,我正在循环一个 http get 请求并使用 rxjs forkJoin 将所有响应组合到一个可观察到的对象中,然后返回到我的组件。对于返回的每个响应,我需要向 json 添加两个属性(readySystem 是一个对象,serviceType 是一个字符串)。对于循环的每次迭代,其中每一个的值都不同。

如何保留/存储/保留 和 的值并将它们映射/添加到正确的响应?

按照我在下面尝试执行的方式,在最终可观察对象中返回的每个响应中,两者的值都是相同的。

  getServices() {

  for (var x = 0; x < this.service.items.length; x++ ){
        var num = Object.keys(this.service.items[x].links).length;

         for (var key in this.service.items[x].links) {
            var systemName = this.service.items[x].systemName;
            var environment = this.service.items[x].environment;
            var server = this.service.items[x].server;
            var port = this.service.items[x].port;
            var linkName = this.service.items[x].links[key];
            var serviceType = key;
            this.observables.push(
            this.http.get('http://localhost:3000/myapi/get/service?server=' + server + '&service=' + linkName)
            .map((res:Response) => { 
                var output = res.json()
                for (var obj in output) {
                    if (output.hasOwnProperty(obj)){

                        var readySystem = new System(systemName,
                         environment,
                         server,
                         port,
                         linkName);

                    output[obj].System = readySystem;
                    output[obj].serviceType = serviceType;
                    }
                }
                return output;
        })
            );
        }
        };
        return Observable.forkJoin(this.observables);
};

更新:根据下面答案中提供的建议代码更改,我得到如下输出:

0: Array(33)
1: System
    systemName: "my system"
    environment: "my environment"
    etc.
2: "myservice"
3: Array(35)
4: System
   etc.
5: "myotherservice"

但是,需要的是:

0: Array(33)
 0: Object
  > System
      systemName: "my system"
      environment: "my environment"
      etc.
   serviceType: "myservice"
 1: Object
  > System
      systemName: "my system"
      environment: "my environment"
      etc.
   serviceType: "myotherservice"
 etc.
1: Array(35)
 0: Object

最佳答案

只需使用 Observable.of 将这些值添加到 fork

function getObsevrables(observables, readySystem, serviceType) {
   return Rx.Observable.forkJoin([
     Rx.Observable.of(readySystem), 
     Rx.Observable.of(serviceType), 
     ...observables
    ]);
}

getObsevrables([Rx.Observable.of(1), Rx.Observable.of(2)], 
           {ready: true}, 'type1')
   .subscribe(x=>console.log(x))

更新:

我尝试更新您的代码。

getServices() {

for (var x = 0; x < this.service.items.length; x++) {
  var num = Object.keys(this.service.items[x].links).length;

  for (var key in this.service.items[x].links) {
    var systemName = this.service.items[x].systemName;
    var environment = this.service.items[x].environment;
    var server = this.service.items[x].server;
    var port = this.service.items[x].port;
    var linkName = this.service.items[x].links[key];
    var serviceType = key;

    var readySystem = new System(systemName,
      environment,
      server,
      port,
      linkName);

   // getObservables([Observable.of(1), Observable.of(2)], readySystem, serviceType).subscribe(x => console.log(x));

    this.observables.push(
      Observable.combineLatest(
        this.http.get('http://localhost:3000/myapi/get/service?server=' + server + '&service=' + linkName)
        .map((res: Response) => {
          var output = res.json();
          return output;
        });
       }, 
       Observable.of(serviceType), 
       Observable.of(readySystem)
    )
   );
}
}

关于Angular Looped HTTP 请求将值映射到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44200851/

相关文章:

javascript - 如何在 Angular 4 中将 observable<User> 转换为 Observable<boolean>

HTTP GET 和 POST 语义和限制

javascript - 为什么请求接受: */* when the browser is asking for a javascript file?

ASP.net 设计问题,如果在 HTTPS 上则强制重定向到 HTTP

c# - 按照 MSDN 博客示例进行异步进度和取消时出现 Lamba 错误

angular - Safari 忽略 Angular 动画计时功能

angular - 在 Angular2 Typescript 上使用 VTTCue 对象

angularjs - 吴升级 : Unable to use templateUrl when upgrading Angular1 components

java.awt.EventQueue.invokeLater 解释

javascript - 在从 API 接收值之前调用 React 状态