Angular 2获取系列

时间:2017-05-01 01:00:13

标签: json angular http callback angular2-services

我有一个配置服务,用于从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上不存在”。我在这里做错了什么,以及什么是串联获取请求的正确方法。

2 个答案:

答案 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));

所以是的,朱莉娅的switchMapflatMap效果很好,只需确保在你的函数中返回一个值。subscribe "does not exist on type void"错误是因为你正在返回{ {1}}当您需要返回null

希望有所帮助!