你可以在Angular 2(使用Typescript)中返回一个observable作为一个承诺吗?

Rob*_*eer 3 typescript ionic2 angular

我正在学习使用Angular 2和Typescript在Ionic 2中进行开发.

我立即尝试的是创建一个函数,该函数返回一个在观察到的变量发生变化时得到解决的promise.

这对我来说很有用,可以在页面组件尝试使用它之前检测提供程序中的初始化是否已完成.例如

api.isInitialized()
    .then(() => {
        //api provider is initialized. Now safe to call it!
        return api.fetch("NEWS");
    });
    .then((newsData) => {
        //do something with newsData
    });
Run Code Online (Sandbox Code Playgroud)

我有以下导入:

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
import { Observable} from 'rxjs/Observable';
Run Code Online (Sandbox Code Playgroud)

只是为了检查我对如何使用促销的理解,我尝试调用以下函数.我只得到"testObservable已经改变".我希望也得到"承诺解决".

如何更改testObservable以获得已解决的承诺?

 observerTest(){
    let testObservable: any;
    let testObserver: any;

    testObservable = Observable.create(observer => {
        testObserver = observer;
    });

    let myPromise = testObservable.toPromise();

    testObservable.subscribe(data => {
        console.log("testObservable has changed.");
        console.log(data);
    });

    myPromise.then(() =>{
        console.log("promise resolved.");
    });

    testObserver.next(true);
}
Run Code Online (Sandbox Code Playgroud)

小智 9

官方Angular教程包含示例,尤其是在HTTP章节中.例如:

getHeroes(): Promise<Hero[]> {
  return this.http.get(this.heroesUrl)
           .toPromise()
           .then(response => response.json().data as Hero[])
           .catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)

delete(id: number): Promise<void> {
  const url = `${this.heroesUrl}/${id}`;
  return this.http.delete(url, {headers: this.headers})
    .toPromise()
    .then(() => null)
    .catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)


Sag*_*rni 5

这就是您如何将 Observable 作为承诺返回的方式。假设api.fetch("NEWS")返回一个 Observable。

test(){
    return new Promise(resolve => {
        api.fetch("NEWS")
        .subscribe(data => {
            resolve(data);
        },(err) => {
            resolve(err);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

在调用方,您将按照承诺处理它:

provider.test().then(data => {
    console.log("Data : ",data);
}).catch(err => {
    console.log("Error : ",err);
});
Run Code Online (Sandbox Code Playgroud)

不过,我不确定,为什么要返回 Observable 作为承诺?

一个用例可能是 - 已经有很多调用方法被编写来接收来自提供者的承诺。现在,突然之间,提供者代码返回的是 Observable 而不是 Promise。

否则,.subscribe()通过.then()调用方法处理 Observable via和 Promise via 会更简单。