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

3
我的 Service 类包含以下代码: 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()呢?

因为 toPromise 可以在 Observable 上调用,而不是 Subscription,并且 toPromise 执行订阅。 - cartant
此外,您问题中的链接引用了 RxJS 4 文档。在 Angular 中使用的 RxJS 5 的文档在这里。 - cartant
1个回答

4
要从Observable中获取值,您需要在Observable上调用subscribe()方法。这将启动Observable并向您发送它产生的值。
如果您更喜欢使用Promise,则可以在Observable上调用toPromise()方法。这将使Observable表现得像一个普通的promise。
在底层,toPromise()方法调用Observable上的subscribe()方法,并等待它发送complete()信号。当收到complete()信号时,promise将解析最后发出的next()信号。 toPromise()看起来有点像这样:
myObservable.takeLast().subscribe(value => resolve(value));

感谢您提到发生在引擎内部的事情 ⭐ - Prid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接