为什么我们不需要在将它转换为Promise之前订阅一个observable?

时间:2017-07-24 06:41:12

标签: promise rxjs observable

我的服务类包含以下代码:

Service.ts

//all imports are done
@Injectable()
export class Service{


    constructor(private http: Http) { }

    getGoogle():Observable<any> {
        console.log("Inside service");
        return this.http.get('https://jsonplaceholder.typicode.com/posts/1');
    }
}

我使用服务的页面组件。

Page.ts

//all imports are done

export class Page1{

constructor(private service: Service, private navCtrl: NavController) { }


 async get() {
    console.log("inside get method");
    const data =  await this.service.getGoogle().toPromise();
      console.log('The response is' , data);
       }

}

我已经获得了所需的结果,但是为了理解Observables和Observer的概念,我的Observable应该有一个Observer来订阅。那么为什么代码const data = await this.service.getGoogle.subscribe().toPromise()不能在这里工作并显示错误property toPromise() does not exists on type Subscription.

我看到toPromise()的官方资源,我发现它与.just().toPromise()一起使用。然后我找到了.just() API,其中说明了

  

just()方法将其参数作为OnNext通知发出,并且   之后,它会发出OnCompleted通知。

所以它在这里使用了subscribe的功能,为什么它不与.subscribe()一起使用?

1 个答案:

答案 0 :(得分:2)

要从可观察量中获取值,您将subscribe()放在可观察量上。这将启动observable,它将向您发送它产生的值。

如果您想使用Promise,可以在observable上调用toPromise()。这将使可观察的行为像常规的承诺。

在幕后,toPromise()在观察点上调用subscribe(),并等待它发送complete()。收到complete()信号后,承诺将解析最后发出的next()信号。

toPromise()看起来有点像这样:

myObservable.takeLast().subscribe(value => resolve(value));