Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你能在Angular 2中(使用Typescript)返回一个observable作为承诺吗?_Angular_Typescript_Ionic2 - Fatal编程技术网

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

你能在Angular 2中(使用Typescript)返回一个observable作为承诺吗?,angular,typescript,ionic2,Angular,Typescript,Ionic2,我正在学习使用Angular 2和Typescript开发Ionic 2 我马上要做的是创建一个函数,它返回一个承诺,当观察到的变量发生变化时,这个承诺就会得到解决 这将有助于我在页面组件尝试使用它之前检测提供者内的初始化何时完成。e、 g api.isInitialized() .then(() => { //api provider is initialized. Now safe to call it! return api.fetch("NE

我正在学习使用Angular 2和Typescript开发Ionic 2

我马上要做的是创建一个函数,它返回一个承诺,当观察到的变量发生变化时,这个承诺就会得到解决

这将有助于我在页面组件尝试使用它之前检测提供者内的初始化何时完成。e、 g

api.isInitialized()
    .then(() => {
        //api provider is initialized. Now safe to call it!
        return api.fetch("NEWS");
    });
    .then((newsData) => {
        //do something with newsData
    });
我有以下进口产品:

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
import { Observable} from 'rxjs/Observable';
为了验证我对toPromise如何工作的理解,我尝试调用以下函数。我只得到“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);
}

这就是如何将可观察到的作为承诺返回的方法。假设
api.fetch(“NEWS”)
返回一个可观察的

test(){
    return new Promise(resolve => {
        api.fetch("NEWS")
        .subscribe(data => {
            resolve(data);
        },(err) => {
            resolve(err);
        });
    });
}
在呼叫方,您将按照承诺进行处理:

provider.test().then(data => {
    console.log("Data : ",data);
}).catch(err => {
    console.log("Error : ",err);
});
但是,我不确定,为什么要返回一个可观察的作为承诺

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

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

官方包含了一些示例,尤其是在。例如:

getHeroes(): Promise<Hero[]> {
  return this.http.get(this.heroesUrl)
           .toPromise()
           .then(response => response.json().data as Hero[])
           .catch(this.handleError);
}
getHeroes():承诺{
返回this.http.get(this.heroesUrl)
.toPromise()
.then(response=>response.json().data作为英雄[])
.接住(这个.把手错误);
}

delete(id:number):承诺{
常量url=`${this.heroesUrl}/${id}`;
返回this.http.delete(url,{headers:this.headers})
.toPromise()
。然后(()=>null)
.接住(这个.把手错误);
}

这不是因为您可以选择使用
.subscribe
或使用
toPromise()将您的可观测值解析为可观测值还是作为承诺。然后,如果您同时执行这两个操作,则在解析后只调用一个。我发现用testObserver.complete()替换最后一行;给了我想要的行为。正如Brandon在回答问题()时所提到的,“当RxJs将一个可观察对象转换为承诺时,它会创建一个承诺,该承诺将从可观察对象中产生最后一个值。因此,在基础可观察对象完成之前,承诺不会解决。”
delete(id: number): Promise<void> {
  const url = `${this.heroesUrl}/${id}`;
  return this.http.delete(url, {headers: this.headers})
    .toPromise()
    .then(() => null)
    .catch(this.handleError);
}