Как вернуть логическое наблюдаемое и проверить это логическое значение - PullRequest
0 голосов
/ 07 марта 2020

Я хочу использовать observable, чтобы иметь возможность выполнять мой код синхронно, я хочу вернуть истинное значение после того, как получу значки с сервера, чтобы я мог его использовать. Как мне это сделать?

ngOnInit() {
  this.addIcons().subscribe(data=>{
    if(data===true)
      //do something use the data

  });
}

addIcons():Observable<boolean>{

  this.Service.getIcons().subscribe(icons => {

    return  return observableOf(true);   
  });

  return observableOf(false);   

}

Ответы [ 3 ]

0 голосов
/ 07 марта 2020

Вы бы использовали оператор из и switchMap из Rx JS.

Ваш метод addIcons становится:

import { of } from 'rxjs';
import { switchMap } from 'rxjs/operators'

ngOnInit() {
  this.addIcons().subscribe(data=>{
    if(data===true)
      //do something use the data

  });
}

addIcons():Observable<boolean>{
  return this.Service.getIcons().pipe(
    switchMap((response) =>{
      // do something with icons response
      // based on some condition return true or false
      return of(true)
    })
  )
}
0 голосов
/ 07 марта 2020

Ваша функция addIcons () всегда возвращает наблюдаемое значение false. сначала вы подписываетесь на функцию getIcons (), затем возвращает observableOf (false), и только после этого происходит подписка.

Я бы сделал следующее

private sub: Subscription;
ngOnInit() {
    this.sub = this.getIcons$()
        .subscribe(data => {
            if (data){
                //do something use the data
            }
    });
}

ngOnDestroy() {
    this.sub.unsubscribe();
}

getIcons$(): Observable<boolean> {
    return this.Service.getIcons()
        .pipe(
            map(icons => {
                return icons ? true : false
            })
        )
}

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

0 голосов
/ 07 марта 2020
addIcons():Observable<boolean>{
  const result = new Subject<boolean>();

  this.Service.getIcons().subscribe(icons => {

    result.next(true);
    result.complete();
  },
  error => {
    result.next(false);
    result.complete();
  });   

  return result.asObservable();
}
...