#angular #rxjs #observable
#angular #rxjs #наблюдаемое
Вопрос:
Я хочу вернуть значение (любые данные) из сервиса в компонент в качестве наблюдаемого. После пары поисков в наблюдаемых найдено следующее решение:
class AppService {
getData(value) {
// do we have any other best way to return value as an observable
return Observer.create((observer) => {
observer.next(value);
});
}
}
class AppComponent implements OnInit {
ngOnInit() {
this.dataService$ = this.appService.getData().subscribe((data) => {
// do some task with data
});
}
}
Комментарии:
1.
return of(value)
2. Вы уже нашли ответ, в чем здесь вопрос?
Ответ №1:
Просто верните, как показано ниже
import { Observable, of } from 'rxjs';
...
getData(value) : Observable<any> {
// Simple way of sending value using of operator.
return Observable.of(value);
}
Надеюсь, это поможет!
Комментарии:
1. спасибо, это сработало, вы знаете, нужно ли мне делать так или иначе, возвращая наблюдаемое в качестве значения;
2. да, вам нужно вернуть наблюдаемое как значение, чтобы вы могли подписаться на obsevable для получения данных в компоненте
Ответ №2:
Используйте of
вот так:
import { of } from 'rxjs';
...
return of(value);
что эквивалентно:
return new Observable(obs => obs.next(value));
Однако, если вы хотите преобразовать заданное значение (например, обещание, объект, подобный наблюдаемому, массив, итерируемый или массивоподобный объект), вы можете использовать from
:
import { from } from 'rxjs';
...
return from(value);
Ответ №3:
Вот что я делаю
В вашем сервисном файле :
Сначала я объявляю свое наблюдаемое таким образом
myObs: BehaviorSubject<any> = new BehaviorSubject([]);
В этом методе вы можете установить свои данные в свой obs :
var myArray = [1,2,3,4,5];
this.myObs.next(myArray);
Если вы хотите, чтобы ваш «контроллер» подписался на этот obs в вашем сервисе, просто предоставьте средство получения :
public getMyObs(){
return this.myObs.asObservable()
}
И в вашем «контроллере» вы можете назвать это таким образом :
ngOnInit() {
this.myService.getMyObs().subscribe(datas => {
Do What you want with your datas
}
}