代码之家  ›  专栏  ›  技术社区  ›  Stéphane GRILLON

如何通过角6和rxjs 6从forkjoin的subscribe返回值?

  •  1
  • Stéphane GRILLON  · 技术社区  · 6 年前
    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;
    

    所以我需要在订阅结束后返回END。我想我们必须把这个函数减半。

    重要提示:返回保存(有效负载)

    3 回复  |  直到 6 年前
        1
  •  1
  •   Vikas RyanSand20    6 年前

    subscribe方法有3个参数函数。

    1) next() ,您使用过
    2) error() ,你还没有
    3) complete() ,在流完成后运行。

    因此,您可以像这样将createCipe添加到完整的回调中:

    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;
        });
      },
    err => {},
    () => {
        this.createRecipe(payload);
    });
    

    这将在加载所有有效负载时调用CreateCipe方法(在解决newMedias数组中的所有可见项后)。

    希望这有帮助。

        2
  •  0
  •   Sachila Ranawaka    6 年前

    需要一个函数来返回合并自 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);
        });
      }); 
    }
    
        3
  •  0
  •   Stéphane GRILLON    6 年前

    我的解决方案结束了吗:

    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 .