Невозможно использовать Array.toString () после suscribe и push - PullRequest
0 голосов
/ 19 апреля 2020

Вот проблемный c фрагмент кода:

const arr1 = new Array;

this.formData.players.split(',').forEach((id) => {
  this.userService.getUser(Number(id)).subscribe((user: User) => {
    arr1.push(user.firstname + ' ' + user.lastname);
  });
});

console.log(arr1);
console.log('Players: ' + arr1.join(', '));

/* - - - - - */

const arr2 = new Array;

arr2.push('orange');
arr2.push('mango');
arr2.push('banana');
arr2.push('sugar');

console.log(arr2);
console.log('Test: ' + arr.join(', '));

Первая часть - получение идентификатора пользователя из базы данных Spring. Второй - для тестирования.

Мой журнал:

[]
  0: "John Doe"
  1: "Jane Doe"
  length: 2
  __proto__: Array(0)

Players:

(4) ["orange", "mango", "banana", "sugar"]
  0: "orange"
  1: "mango"
  2: "banana"
  3: "sugar"
  length: 4
  __proto__: Array(0)

Test: orange, mango, banana, sugar

Я не понимаю, почему мой первый фрагмент кода отказывается отображать:

Players: John Doe, Jane Doe

1 Ответ

1 голос
/ 19 апреля 2020

Я думаю, что причина этого в том, что ваша функция console.log будет вызвана до того, как все подписки будут завершены.

You can try to use something like https://www.learnrxjs.io/learn-rxjs/operators/combination/mergeall instead.

from(this.formData.players.split(',')).pipe(
  map(id => this.userService.getUser(Number(id)).pipe(tap(user: User) => {
    arr1.push(user.firstname + ' ' + user.lastname);
  })),
  mergeAll()
).subscribe((data) => {
  console.log(arr1);
  console.log('Players: ' + arr1.join(', '));
});
...