我不知道如何从Observable中提取值,以便由Observable存在的函数返回。我只需要返回一个值即可返回。
适用的当前版本
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
console.log(data)
}
)
}
getValueFromObservable()
我需要这个工作,函数返回值,然后:
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
return data
}
)
}
console.log(getValueFromObservable())
我在这里做错了什么?
答案 0 :(得分:26)
我意识到这个问题已经有一段时间了,你现在肯定有一个合适的解决方案,但对于任何寻找这个问题的人,我建议用Promise解决它以保持异步模式。 更冗长的版本将创建一个新的Promise:
function getValueFromObservable() {
return new Promise(resolve=>{
this.store
.take(1) //useful if you need the data once and don't want to manually cancel the subscription again
.subscribe(
(data:any) => {
console.log(data;
resolve(data);
})
}
}
在接收端,您将等待"等待"承诺通过这样的方式解决:
getValueFromObservable()
.then((data:any)=>{
//... continue with anything depending on "data" after the Promise has resolved
})
更纤薄的解决方案是使用RxJS' .toPromise()代替:
function getValueFromObservable() {
return this.store
.take(1)
.toPromise()
}
接收方保持与上述相同。希望有所帮助!
答案 1 :(得分:16)
使用Observable
在组件中,您必须声明将保存对象的类成员(您将在组件中使用的东西)
export class MyComponent {
name: string = "";
}
然后Service
将为您返回Observable
:
getValueFromObservable():Observable<string> {
return this.store.map(res => res.json());
}
Component
应该准备好从中检索一个值:
OnInit(){
this.yourServiceName.getValueFromObservable()
.subscribe(res => this.name = res.name)
}
您必须将Observable
中的值分配给变量:
您的模板将使用变量name
:
<div> {{ name }} </div>
使用Observable
的另一种方法是通过async
管道http://briantroncone.com/?p=623
注意:如果不是您的要求,请更新您的问题并提供详细信息
答案 2 :(得分:7)
如果您想预先订阅将要返回的相同Observable,请使用
。做():
function getValueFromObservable() {
return this.store.do(
(data:any) => {
console.log("Line 1: " +data);
}
);
}
getValueFromObservable().subscribe(
(data:any) => {
console.log("Line 2: " +data)
}
);
答案 3 :(得分:4)
问题在于数据是在可观察的内部捕获的,我可以通过控制台对其进行记录。我想通过调用它所驻留的函数来返回该值和console.log或其他文件中的任何内容。
看起来就像您在观察对象内部(发射时以及发射后)寻找“当前值”吸气剂一样。
Subject
和Observable
没有这样的东西。发出值时,它会传递给其订阅者,并完成Observable
。
您可以使用BehaviorSubject
来存储最后发出的值,并立即将其发送给新订户。
它还有一个getValue()
方法来获取当前值;
进一步阅读:
答案 4 :(得分:1)
可以从任何位置检索可观察值。源序列首先推送到一个能够在其他地方发射的特殊观察者。这是通过Reactive Extensions(RxJS)中的主题类实现的。
var subject = new Rx.AsyncSubject(); // store-last-value method
将值存储到观察者。
subject.next(value); // store value
subject.complete(); // publish only when sequence is completed
要从其他地方检索值,请按以下方式订阅观察者:
subject.subscribe({
next: (response) => {
//do stuff. The property name "response" references the value
}
});
受试者既是可观察者又是观察者。对于其他使用场景,还有其他Subject types,例如BehaviourSubject和ReplaySubject。
不要忘记导入RxJS。
var Rx = require('rxjs');
答案 5 :(得分:1)
虽然先前的答案可能以某种方式起作用,但我认为,如果您想继续使用可观察对象,那么使用BehaviorSubject是正确的方法。
示例:
this.store.subscribe(
(data:any) => {
myService.myBehaviorSubject.next(data)
}
)
在服务中:
let myBehaviorSubject = new BehaviorSubjet(value);
在component.ts中:
this.myService.myBehaviorSubject.subscribe(data => this.myData = data)
我希望这会有所帮助!
答案 6 :(得分:0)
在JavaScript async/await
的单线程,异步,面向承诺,反应趋势的世界中,命令式程序员最好的朋友:
(async()=>{
const store = of("someValue");
function getValueFromObservable () {
return store.toPromise();
}
console.log(await getValueFromObservable())
})();
如果store
是由多个值组成的序列:
const aiFrom = require('ix/asynciterable').from;
(async function() {
const store = from(["someValue","someOtherValue"]);
function getValuesFromObservable () {
return aiFrom(store);
}
for await (let num of getValuesFromObservable()) {
console.log(num);
}
})();
答案 7 :(得分:0)
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
return data
}
)
}
console.log(getValueFromObservable())
在上述情况下,console.log在承诺未解决之前运行,因此不会显示任何值,将其更改为以下内容
function getValueFromObservable() {
return this.store
}
getValueFromObservable()
.subscribe((data: any) => {
// do something here with data
console.log(data);
});
另一种解决方案是,当您需要getValueFromObservable内部的数据以返回操作符的可观察值并订阅该函数时。
function getValueFromObservable() {
return this.store.subscribe((data: any) => {
// do something with data here
console.log(data);
//return again observable.
return of(data);
})
}
getValueFromObservable()
.subscribe((data: any) => {
// do something here with data
console.log(data);
});
答案 8 :(得分:0)
一种体面的方法是从一个函数返回可观察的对象,并在需要时订阅它,因为可观察的对象是惰性的,它们只有在被订阅时才开始发出值。
在这里,我还有一个有趣的事件驱动解决方案,我最初使用它来玩。以下示例通过使用nodejs的“ 事件”模块来完成此操作。 您可以将其与存在类似模块的其他框架一起使用(注意:语法和样式可能会根据所使用的模块而有所不同)。
var from =require("rxjs").from;
var map = require("rxjs/operators").map;
var EventEmitter = require("events");
function process(event) {
from([1,2,3]).pipe(
map(val => `The number is:: ${val}`)
).subscribe((data) => {
event.emit("Event1", data); //emit value received in subscribe to the "Event1" listener
});
}
function main() {
class Emitter extends EventEmitter{};
var event = new Emitter(); //creating an event
event.on("Event1", (data)=>{ //listening to the event of name "Event1" and callback to log returned result
console.log(data); //here log, print, play with the data you receive
});
process(event); //pass the event to the function which returns observable.
}
main(); //invoke main function
这只是一个例子,展示了我们可以通过发出和收听的方式从不同位置传递数据的想法。这也称为事件驱动代码。
答案 9 :(得分:-1)
例如,这是我的html模板:
<select class="custom-select d-block w-100" id="genre" name="genre"
[(ngModel)]="film.genre"
#genreInput="ngModel"
required>
<option value="">Choose...</option>
<option *ngFor="let genre of genres;" [value]="genre.value">{{genre.name}}</option>
</select>
这是与我的组件中的模板绑定的字段:
// Genres of films like action or drama that will populate dropdown list.
genres: Genre[];
我从服务器动态获取电影流派。为了与服务器通信,我创建了FilmService
这是与服务器通信的方法:
fetchGenres(): Observable<Genre[]> {
return this.client.get(WebUtils.RESOURCE_HOST_API + 'film' + '/genre') as Observable<Genre[]>;
}
为什么此方法返回Observable<Genre[]>
而不是Genre[]
?
JavaScript是async
,它不等待昂贵的过程后返回值的方法。昂贵的意思是一个需要花费时间才能返回价值的过程。就像从服务器获取数据一样。因此,您必须返回Observable的引用并进行订阅。
例如在我的组件中:
ngOnInit() {
this.filmService.fetchGenres().subscribe(
val => this.genres = val
);
}