将一堆物品推到服务器上

时间:2018-11-03 04:27:44

标签: angular typescript rxjs observable

如果运行以下代码,则会收到错误TypeError: Object(...)(...).subscribe is not a function

push(models: Model[]): void {
    from(models).pipe(
                     mergeMap((m: Model) => this.service.push(m)),
                     bufferCount(models.length)
                ).subscribe(() => log('done'));
}

我想要实现的是将每个模型并行推送到服务器。当所有推送完成后,我会记录一条消息。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这里有一些简化的代码可以满足您的需求。

重要的一点是服务中的push方法。显然,您需要更改它以匹配您发出的HTTP请求。 console.log中的ngOnInit语句记录所有响应完成后的所有服务器响应的列表。

.ts:

import { Component, OnInit } from '@angular/core'
import { PushItService } from './push-it.service'

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent implements OnInit {

  public myObservable$

  constructor(private pushItService: PushItService) {}

  ngOnInit() {
    this.myObservable$ = this.pushItService.push([{id: 1}, {id: 2}, {id: 3}])
    this.myObservable$.subscribe((data) => {
      console.log('data', data)
    })
  }
}

.service.ts:

import { Injectable } from '@angular/core'
import { HttpClient } from '@angular/common/http'
import { forkJoin, of } from 'rxjs'
import { mergeMap } from 'rxjs/operators'

@Injectable({
  providedIn: 'root'
})

export class PushItService {
  constructor(private http: HttpClient) {}

  push(arr) {
    return of(arr).pipe(
      mergeMap(value => forkJoin(value.map(v => this.http.get('http://localhost:3000/random/' + v.id))))
    )
  }
}

我使用此资源编写了此代码... https://www.learnrxjs.io/operators/combination/forkjoin.html ...参见示例2

已经对此进行了测试,并且可以正常工作,但是您应该引入一些错误处理。 This will help you too