2017-03-02 72 views
1

我正在学习使用Angular 2和Typescript在离子2中进行开发。你可以返回一个observable作为Angular 2(使用Typescript)的承诺吗?

我立即试图创建一个函数,该函数返回一个在观察变量发生变化时得到解决的承诺。

对于我来说,在页面组件尝试使用它之前检测提供程序中的初始化是否已完成时,这将会非常有用。例如

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); 
} 
+1

是不是因为你有解决您的观察为可观察到的与'.subscribe'或用'toPromise(承诺之间选择),然后。 ' 如果你这样做了,只有一个人一旦解决就会被调用。 – deKajoo

+0

我发现用testObserver.complete()替换最后一行;给我我想要的行为。正如Brandon在回答问题(http://stackoverflow.com/questions/38557214/rxjs-topromise-behavior-different-than-observable)时提到的那样“当RxJs将Observable转换为Promise时,它会创建一个Promise,从可观察到的最后一个值。因此,承诺不会解决,直到潜在的observable完成。“ –

回答

3

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

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用例可能是 - 已经有很多调用方法被写入来接收提供者的承诺。现在,供应商代码突然返回一个Observable而不是Promise。

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

7

官方Angular tutorial包含的例子,特别是在HTTP chapter。例如:

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

delete(id: number): Promise<void> { 
    const url = `${this.heroesUrl}/${id}`; 
    return this.http.delete(url, {headers: this.headers}) 
    .toPromise() 
    .then(() => null) 
    .catch(this.handleError); 
} 
相关问题