Ответы пользователя по тегу Reactive Extensions
  • Как правильно вернуть catchError в Rxjs - чтобы не происходила отписка?

    search
    @search
    мама говорит что я особенный
    Как только вы попали в callback error функции subscribe - это означает что поезд ушел и прийдётся что-то мудрить чтоб переподписаться на
    fromEvent<any>(this.sendBtn.nativeElement, 'click')


    Каких-то магических операторов для того чтоб и в функцию error попасть и подписку при этом сохранить не существует. Можно, конечно, сделать как-то так:

    import { EMPTY } from 'rxjs';
    
    fromEvent<any>(this.sendBtn.nativeElement, 'click')
      .pipe(
        map((event) => event.target.value),
        tap(() => this.documentSend$.next(true)),
        switchMap(() =>
          this.applicationDocumentsService
            .sendrequest({
              appid: this.appid,
              req: this.requestDocument,
            })
            .pipe(
              cachError((error: HttpErrorResponse) => {
                this.messageService.showMessage('', `${err.error}`, 'error');
                return EMPTY;
              }),
              finalize(() => this.documentSend$.next(false)),
            )
        ),
    
        takeUntil(this.closed$)
      )
      .subscribe((response) => {
        console.log(response);
        this.dialogRef.close(response);
      });
    Ответ написан
  • Как заполнить state?

    search
    @search
    мама говорит что я особенный
    Не совсем понял проблему, но стены находятся в первом элементе массива action. Если вы хотите передать их в state, то это можно сделать как-то так

    game$.subscribe((action) => {
      switch (action[0]) {
        case 'ArrowUp':
          if(state.y > 0) { state.y--; }
          break;
        case 'ArrowRight':
          if(state.x < gameWidth - 1) { state.x++; }
          break;
        case 'ArrowDown':
          if(state.y < gameHeight - 1) { state.y++; }
          break;
        case 'ArrowLeft':
          if(state.x > 0) { state.x--; }
          break;    
      }
      
      state.walls = action[1];  
      renderGame(state);
      console.log(state)
    });
    Ответ написан
    Комментировать
  • Merge несколько observable - как узнать какой именно observable сработал?

    search
    @search
    мама говорит что я особенный
    В таком случае было бы разумно сделать сделать нужные действия для каждого из обзёрваблов по отдельности.

    merge(
      observable1.pipe(
        // do stuff related to form 1
      ),
      observable2.pipe(
        // do stuff related to form 2
      ),
      ...
    )
    Ответ написан
    Комментировать
  • Как вернуть данные или сделать еще два запроса в Rx.js в зависимости от результата первого запроса?

    search
    @search
    мама говорит что я особенный
    Это делается через switchMap:

    this.httpClient.get('/check-email').pipe(
      switchMap(emailResult => {
        if (emailResult !== exists) {
          return of(dataForNonExistingEmail);
        }
        
        return forkJoin(
          this.httpClient.get('/user-data1'),
          this.httpClient.get('/user-data2')
        );
      })
    )
    Ответ написан
    3 комментария
  • Как в RxJS сделать переодичный вызов в n времени, только после завершения текущей итерации?

    search
    @search
    мама говорит что я особенный
    Как-то так:

    this.httpClient.request(...).pipe(
      repeatWhen(complete => complete.pipe(delay(20000))
    ).subscribe(result => console.log(result))
    Ответ написан
    Комментировать
  • RxJs: условный mergeMap в pipe?

    search
    @search
    мама говорит что я особенный
    // Да, сначала мы делаем map, потому что он делается полюбому:
    
    let doSomething$ = this.myApi.getSomething(id).pipe(
      map(tags => ({ ...updatedShop, tags }))
    )
    
    // А затем мы делаем mergeMap если понадобится:
    
    if (shop.isNew) {
      doSomething$ = doSomething$.pipe(
        mergeMap(() =>
                      this.myApi.addTags(updatedShop.id, shop.tags).pipe(
                          map(() => {
                              return {
                                  ...updatedShop,
                                  tags: shop.tags
                              };
                          })
                      )
                  )
      )
    }
    
    // ну и затем подписываемся на это дело чтоб оно начало работать:
    
    doSomething$.subscribe();


    Вам будет значительно легче понять RxJS после просмотра вот этого видео: https://www.youtube.com/watch?v=3LKMwkuK0ZE Оно слега отстало от времени (операторы к обозревателю теперь добавляются через функцию pipe()), но сами принципы, описанные в видео, никуда не делись.

    UPD

    Если код выше повергает вас в тоску, то можно сделать так:

    this.myApi.getSomething(id).pipe(
      map(tags => ({ ...updatedShop, tags })),
      mergeMap((tags) => {
        if (!shop.isNew) {
          return of(tags);
        }
       return this.myApi.addTags(updatedShop.id, shop.tags).pipe(
                          map(() => {
                              return {
                                  ...updatedShop,
                                  tags: shop.tags
                              };
                          })
                      )
      }),
    )


    Имеется ввиду, что можно иф вынести в сам mergeMap. И если магаз не новый, то возвращать обзёрвбл от магаза, а если новый, то сделать что-то там еще.
    Ответ написан
    1 комментарий
  • Не избыточно ли использовать rxjs/Observable?

    search
    @search
    мама говорит что я особенный
    В ангуляре практически все (если не все) асинхронные операции возвращают Observable. Избегая его использование вы не получите никаких выигрышей, а наоборот сильно усложните себе жизнь выбиваясь из экосистемы фреймворка. Вот статья, которая помогла мне разобраться с rxjs https://habrahabr.ru/company/infopulse/blog/338910/
    Ответ написан
    Комментировать