Возврат результата напрямую из http (наблюдаемой) службы (функции) без возврата Observable - PullRequest
1 голос
/ 15 октября 2019

Какой способ вернуть результат из службы напрямую, без возврата Observable, а затем с помощью предложения then. Я искал много вещей, например, используя pipe, of, take, toPromise, map, async-await, но ни один из них не возвращает результат при вызове службы. Кроме того, некоторые пункты не доступны в текущей версии rxjs . Не могли бы вы помочь?

Примечание У меня есть условие здесь, где, если API не работает, я получаю его из местных.

@Injectable()
export class SomeService {
  GetDataEitherFromApiOrFromLocalStotage():Any 
  {
    let result;
    this.http.get("https://"+ this.url +"/api/main/apidata").subscribe(
       next=>{result=next;},
       error => {result=this.localdata();},  
       ()=>{return result;}
    )
  }
}

при вызове функции (которая возвращает ноль, также с async-await)

@Component()
export class SomeComponent implements OnInit {

  constructor(private service:SomeService) {}

  ngOnInit() {
   let data = this.service.GetDataEitherFromApiOrFromLocalStotage();
  }
}

ОБНОВЛЕНИЕ

Причина I 'Я пытаюсь это сделать, потому что я хочу поместить всю логику в Сервис, а не в Компонент.

1 Ответ

3 голосов
/ 15 октября 2019

Вы можете попробовать что-то вроде этого:

Я включил как маршрут обещания (внизу), так и наблюдаемый маршрут

Изолировать вашAPI / Data Engineering в сервисе - компоненты не должны заботиться о том, как вы его получите.

GetDataEitherFromApiOrFromLocalStorage(): Observable<any> {
    return this.http.get('https://' + this.url + '/api/main/apidata').pipe(
        catchError((error) => {
            // Evaluate if error is fatal or expected
            errorIsNotFatal = true;
            if (errorIsNotFatal) {
                return this.localdata(); // this should return an observable;
            }
            return throwError(error);
        })
    );
}

Обратите внимание на эту часть: catchError () либо вернет истинную ошибку (еслиэто фатально) или получить его из local, если ожидается ошибка.

        catchError((error) => {
            // Evaluate if error is fatal or expected
            errorIsNotFatal = true;
            if (errorIsNotFatal) {
                return this.localdata(); // this should return an observable;
            }
            return throwError(error);
        })

Для того, чтобы это работало, localData () также должна возвращать наблюдаемое:

localdata(): Observable<any> {
    return of('anything or any kind of data');
}

Наконец, в вашем компоненте все, что вам нужно сделать, это подписаться () и дождаться возвращения данных:

export class SomeComponent implements OnInit {
    public data: any;

    constructor(private service: SomeService) {
    }

    ngOnInit() {
        this.service.GetDataEitherFromApiOrFromLocalStorage().subscribe((response) => {
            this.data = response;
        });
    }
}

НАКОНЕЦ - Если ваше требование - это обещание, вы всегда можете сделать это и выполнить свое собственное обещание. Это позволит вам затем позвонить, однако я бы не одобрил это и предложил вместо этого использовать наблюдаемый шаблон:

GetDataEitherFromApiOrFromLocalStorage(): Promise<any> {
    return new Promise((resolve, reject) => {
        this.http.get("https://" + this.url + "/api/main/apidata").subscribe(
            (next) => { resolve(next); },
            (error) => { reject(error); }
        );
    });
}
...