отправить кучу предметов на сервер - PullRequest
0 голосов
/ 03 ноября 2018

Я получаю ошибку 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 голосов
/ 03 ноября 2018

Вот упрощенный код, который делает то, что вы хотите.

Важным битом является метод 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

Протестировал это, и оно работает безупречно, но вы должны представить некоторую обработку ошибок. Это вам тоже поможет

...