операторы rxjs с несколькими вставками - PullRequest
1 голос
/ 14 марта 2019

Как мне использовать rxjs в Angular 6 для вставки элемента, а затем после вставки мне нужно загружать файлы разных типов в разные конечные точки с новым идентификатором элемента в качестве дочернего ключа без необходимости вложения всех этих вызовов.

createItemWithAttachments(data:any)
{    
   this.itemService.insert(data.item).subscribe((newItem:Item)=>{       
        //attachment type 1s 
        if(data.attachmentType1.length > 0){    
         this.attachmentService.upload(data.attachmentType1, 
            "type1", newItem.id).subscribe(newAttachment=>{

         });    
    }    

    //attachment type 2s 
    if(data.attachmentType2.length > 0){    
         this.attachmentService.upload(data.attachmentType2, 
             "type2", newItem.id).subscribe(newAttachment=>{    

         });    
    }    
    });    
}

Ответы [ 2 ]

3 голосов
/ 14 марта 2019

Лучшим способом было бы использовать mergeMap вместе с merge и last для получения последнего значения, полученного в результате слияния. Вы должны определить, что положить внутрь of(). Это должно быть либо undefined / void 0 / null, если вы возвращаете объект из вызова upload, либо пустой массив [], если вы возвращаете массив из загрузки:

createItemWithAttachments({ item, attachmentType1: type1, attachmentType2: type2 }): void {
  this.itemService.insert(item).pipe(
    mergeMap(({ id }: Item) => {
      const mergeUpload = [
        ...(type1.length ? [this.attachmentService.upload(type1, "type1", id)] : []),
        ...(type2.length ? [this.attachmentService.upload(type2, "type2", id)] : [])
      ];

      return mergeUpload.length ? merge(...mergeUpload) : of([]);
    }),
    last()
  ).subscribe((newAttachments) => {

  });
}
2 голосов
/ 14 марта 2019

Я думаю, что есть несколько способов сделать это, но одним из них может быть что-то вроде:

this.itemService.insert(data.item)
    .pipe(
        take(1),
        mergeMap((newItem:Item) => {
            const attachmentUpdateObservables = [];
            if(data.attachmentType1.length > 0){
              attachmentUpdateObservables.push(this.attachmentService.upload(data.attachmentType1, "type1", newItem.id));
            }

            if(data.attachmentType2.length > 0){
              attachmentUpdateObservables.push(this.attachmentService.upload(data.attachmentType2, "type2", newItem.id));
            }

            return combineLatest(attachmentUpdateObservables);

        })
    .subscribe(newAttachments => {
        // Do something
    });
...