Как вызвать функцию после завершения pipe () в angularfire

#angular #asynchronous #pipe #angularfire

#angular #асинхронный #канал #angularfire

Вопрос:

У меня действительно простая проблема, но она вызвала у меня часы разочарования.

У меня есть наблюдаемый снимок из angular firebase, который я передаю через функцию map, чтобы изменить некоторые данные.

вот так:

 this.itemsList = this.itemsRefList.snapshotChanges().pipe(
  map(changes =>
    changes.map(c => ({
      product: c.payload.key,
      firmware: c.payload.child('latest').val(),
      ref: c.payload.ref,
    })
    )
  )
);
  

После завершения работы канала я хотел бы просто вызвать функцию, как я могу этого добиться?

В частности, я использую ngx-admin, и у меня есть карточка, содержимое которой по умолчанию отображается как счетчик загрузки.

 <nb-card>
 <nb-card-header>
...
 </nb-card-header>
 <nb-card-body [nbSpinner]="tableDataLoading" nbSpinnerSize="giant" nbSpinnerStatus="warning">
  <div *ngIf="itemsList | async as items">
    <ng2-smart-table [settings]="settings" [source]="items"></ng2-smart-table>
  </div>
 </nb-card-body>
</nb-card>
  

Как только мой список элементов будет заполнен, я хочу вызвать функцию, которая установит для tableDataLoading значение false, чтобы счетчик исчез.

Каков правильный способ сделать это, я много чего перепробовал, включая подписку на ItemsList и попытку вызвать функцию для этого (говорит мне, что это не функция), пытаясь посмотреть, могу ли я как-то изменить переменную в шаблоне html — безрезультатно и т.д. И т.п.

Комментарии:

1. Просто добавьте .tap после карты..

Ответ №1:

Добавьте скобку в функцию changes.map.

 this.itemsList = this.itemsRefList.snapshotChanges().pipe(
  map(changes =>{
   let temp = changes.map(c => ({
      product: c.payload.key,
      firmware: c.payload.child('latest').val(),
      ref: c.payload.ref,
    }))
   //map is done, call other code here
   this.callOtherMethodHere();
   return temp;
  })
);
  

Комментарии:

1. если я попробую это, компилятор пожалуется, что тип ‘Observable<void>’ не может быть присвоен типу ‘Observable<any[]>’. Тип ‘void’ нельзя присвоить типу ‘any[]’.

2. Отлично, спасибо за вашу помощь, мне просто пришлось удалить предпоследний; return temp; }); <—этот, чтобы заставить его скомпилироваться