Как вернуть значение из подписки на forkJoin с угловым 6 и RxJs 6? - PullRequest
0 голосов
/ 25 сентября 2018
private save(payload) {

  const newMedias: Observable<Media>[] = [];
  const newMediaInStepIndex: number[] = [];

  (payload.formData.steps).forEach((step: Step, stepIndex: number) => {
    const media: Observable<Media> = this.createOneMedia(step);
    if (media !== undefined) {
      newMedias.push(media);
      newMediaInStepIndex.push(stepIndex);
    }
  });

  forkJoin(newMedias).subscribe(medias => {
    medias.forEach((media, i) => {
      console.log('Media created with id: ' + media.id + ' in step ' + newMediaInStepIndex[i]);
      payload.formData.steps[newMediaInStepIndex[i]].media[0].id  = media.id;
    });
  });

  return this.createRecipe(payload);
}

Моя проблема заключается в том, что следующая строка выполняется асинхронно и, следовательно, не до возврата конца:

payload.formData.steps[newMediaInStepIndex[i]].media[0].id  = media.id;

, поэтому мне нужно выполнить возврат конца после окончанияподписываться.Я думаю, что мы должны сократить эту функцию пополам.

ВАЖНО: возврат в сохранение (полезная нагрузка)

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Метод подписки имеет 3 функции параметров:

1) next(), который вы использовали
2) error(), который у вас нет
3) complete(),который запускается по завершении потоказагружены (как только все наблюдаемые в массиве newMedias будут разрешены).

Надеюсь, это поможет.

0 голосов
/ 26 сентября 2018

это конец моего решения:

private save(p): Observable<Action> {

    const payload = JSON.parse(JSON.stringify(p));

    const newMedias: Observable<Media>[] = [];
    const newMediaInStepIndex: number[] = [];

    (payload.formData.steps).forEach((step: Step, stepIndex: number) => {
        const media: Observable<Media> = this.createOneMedia(step);
        if (media !== undefined) {
          newMedias.push(media);
          newMediaInStepIndex.push(stepIndex);
        }
    });

    if (newMedias.length > 0) {
        return forkJoin(newMedias).pipe(mergeMap( (medias) => {
          medias.forEach((media, i) => {
            payload.formData.steps[newMediaInStepIndex[i]].media[0].id = media.id;
          });
          return this.createRecipe(payload);
        }));
    } else {
        return this.createRecipe(payload);
    }

}

Я изменяю subscribe на mergeMap в pipe.Я возвращаю Observable<Action> в ответ на мои forkJoin и возвращаю это в конце save(p).

Я добавляю это: const payload = JSON.parse(JSON.stringify(p));, потому что p происходит от @ngrx.

0 голосов
/ 25 сентября 2018

Нужна функция для возврата наблюдаемых, которые объединяются из forkjoin, а затем подписать ее откуда-то еще

private saveToServer(payload) {

  (payload.formData.steps).forEach((step: Step, stepIndex: number) => {
    const media: Observable<Media> = this.createOneMedia(step);
    if (media !== undefined) {
      newMedias.push(media);
      newMediaInStepIndex.push(stepIndex);
    }
  });

  return forkJoin(newMedias) 
}


private save(payload) { 

  this.saveToServer(payload).subscribe(medias => {
    medias.forEach((media, i) => {
      console.log('Media created with id: ' + media.id + ' in step ' + newMediaInStepIndex[i]);
      payload.formData.steps[newMediaInStepIndex[i]].media[0].id  = media.id;

      //call it here
      this.createRecipe(payload);
    });
  }); 
}
...