我有一个配置服务,用于从json文件中检索特定信息。
getConfiguration(key) {
return this.http.get('./app/config/development.json').map(res => {
this.result = res.json();
return this.result[key];
});
}
我正在尝试获取我的api的基本网址(在development.json中),并使用此网址发出请求。
getJoueurs() {
this.conf.getConfiguration('apiBaseUrl').subscribe((url: any) => {
return this.http.get(url + 'joueur').map(res => res = res.json());
});
}
所以,我订阅了我的配置,然后尝试返回一个可观察的对象,以便在我的组件中捕获它。
在我的组件中:
this.requestService.getJoueurs().subscribe((joueurs) => console.log(joueurs));
事实是我在订阅时遇到错误“在类型void上不存在”。我在这里做错了什么,以及什么是串联获取请求的正确方法。
答案 0 :(得分:1)
您需要使用switchMap / mergeMap / concatMap运算符:
这里是我主要使用的switchMap:
将每个源值投影到一个Observable,该Observable在输出Observable中合并,仅从最近投影的Observable中发出值。 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html
如果您对AngularJS有效并且想要开始使用Observales,您可以查看我的帖子: $ Q映射到RxJS https://medium.com/@juliapassynkova/q-map-to-rxjs-981936a2b22d
getJoueurs() {
this.conf.getConfiguration('apiBaseUrl')
.switchMap((url: any) => this.http.get(url + 'joueur'))
.map(res => res = res.json()
)
.subscribe(joueurs => console.log(joueurs));
}
答案 1 :(得分:0)
好的我会回答能够解释一下。 @ julia的答案主要在那里,但它仍然不适用于你的功能。
我的猜测是您的行:this.requestService.getJoueurs().subscribe((joueurs) => console.log(joueurs));
是您实际使用案例的替代品,因此我将根据Julia的函数本身登出方法来解决它。 (完全有效)
您可以使用打字稿和类型查看订阅时发生的情况。您没有在getJoueurs()
函数中返回任何内容。
var myPhrase = "Do I show up?";
console.log(myPhrase);
console.log('no:', noIDont());
console.log('yes:', yesIDo());
function noIDont() {
myPhrase = 'oh no';
}
function yesIDo() {
myPhrase = 'Yay!';
return myPhrase;
}
// You will see:
// Do I show up?
// No:
// Yes: Yay!
您的功能需要返回值
如果我们对你的函数上的typescript更加精明,你可以将这些例子写成:
function noIDont(): void {
myPhrase = 'oh no';
}
function yesIDo(): string {
myPhrase = 'Yay!';
return myPhrase;
}
所以要修改整个块以包含Julia的例子:
// Get Config
getConfiguration(key): Observable<any>{
return this.http.get('./app/config/development.json').map(res => {
this.result = res.json();
return this.result[key];
});
}
// Get Joueurs, notice the type for the return
getJoueurs(): Observable<any> {
//▼▼▼▼▼▼ MUST HAVE
return this.conf.getConfiguration('apiBaseUrl')
.switchMap((url: any) => this.http.get(url + 'joueur'))
.map(res => res = res.json()
);
}
// calling script in the component:
this.requestService.getJoueurs().subscribe((joueurs) => console.log(joueurs));
所以是的,朱莉娅的switchMap
或flatMap
效果很好,只需确保在你的函数中返回一个值。subscribe "does not exist on type void"
错误是因为你正在返回{ {1}}当您需要返回null
希望有所帮助!