如何从里面有Observable订阅的函数返回值?

Ted*_*ddy 71 rxjs typescript rxjs5 angular

我不知道如何从Observable中提取值以由Observable存在的函数返回.我只需要从中返回一个值,没有别的.

当前版本有效

function getValueFromObservable() {
    this.store.subscribe(
        (data:any) => {
            console.log(data)
        }
    )
}
getValueFromObservable()
Run Code Online (Sandbox Code Playgroud)

我需要这个工作,函数返回值,然后:

function getValueFromObservable() {
    this.store.subscribe(
        (data:any) => {
            return data
        }
    )
}
console.log(getValueFromObservable())
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

小智 33

我意识到这个问题已经有一段时间了,你现在肯定有一个合适的解决方案,但对于任何寻找这个问题的人,我建议用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);
         })
    })
}
Run Code Online (Sandbox Code Playgroud)

在接收端,您将"等待"承诺以这样的方式解决:

getValueFromObservable()
   .then((data:any)=>{
   //... continue with anything depending on "data" after the Promise has resolved
})
Run Code Online (Sandbox Code Playgroud)

一个更苗条的解决方案是使用RxJS'.toPromise()代替:

function getValueFromObservable() {
    return this.store
       .take(1)
       .toPromise()   
}
Run Code Online (Sandbox Code Playgroud)

当然,接收方保持与上述相同.希望有所帮助!

  • 您仍在返回需要解决的承诺,而不是直接返回值。 (11认同)
  • 这个答案太令人困惑了。问题是关于 Observable 的,答案是使用 Promise? (2认同)

And*_*ich 18

这不是完全正确的使用想法 Observable

在组件中,您必须声明将保存对象的类成员(您将在组件中使用的东西)

export class MyComponent {
  name: string = "";
}
Run Code Online (Sandbox Code Playgroud)

那么一个Service将会给你一个Observable:

getValueFromObservable():Observable<string> {
    return this.store.map(res => res.json());
}
Run Code Online (Sandbox Code Playgroud)

Component 应该准备自己能够从中检索一个值:

OnInit(){
  this.yourServiceName.getValueFromObservable()
    .subscribe(res => this.name = res.name)
}
Run Code Online (Sandbox Code Playgroud)

您必须从Observable一个变量赋值:

你的模板将消耗变量name:

<div> {{ name }} </div>
Run Code Online (Sandbox Code Playgroud)

另一种使用方式Observable是通过async管道http://briantroncone.com/?p=623

注意:如果不是您要求的,请更新您的问题并提供更多详细信息


Dud*_*udi 7

如果要预先订阅将返回的相同Observable,只需使用

.做():

function getValueFromObservable() {
    return this.store.do(
        (data:any) => {
            console.log("Line 1: " +data);
        }
    );
}

getValueFromObservable().subscribe(
        (data:any) => {
            console.log("Line 2: " +data)
        }
    );
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用其他运算符,例如`.map(data => data)`执行相同的操作,然后在您希望的结果中订阅它 (2认同)

A. *_*car 5

问题在于数据是在可观察的内部捕获的,我可以通过控制台对其进行记录。我想通过调用它所驻留的函数来返回该值和console.log或其他文件中的任何内容。

好像您在观察对象内部(发射时以及发射后)正在寻找“当前值”吸气剂。

Subject而且Observable没有这样的东西。发出值时,将其传递给其订户并Observable使用它来完成。

您可以使用BehaviorSubject哪个存储最后发出的值,并立即将其发出给新的订户。

它还有一种getValue()获取当前值的方法。

进一步阅读:

RxJS BehaviorSubject

如何获取RxJS Subject或Observable的当前值?