2017-09-07 10 views
0

get要求のコールバックに.map()関数を連結できない理由を理解するのが難しいです。なぜobservablesで.map()関数をチェーン化できないのですか

const random = max => Math.floor((Math.random() * max) + 1); 
this._http.get('https://unsplash.it/list') 
    .map(response => response.json()) 
    .map(metaImages => metaImages.url_post) 
    .subscribe(urls => { 
     this.imgSrc = urls[random(urls.length)]; 
    }); 

だから私はこの

const random = max => Math.floor((Math.random() * max) + 1); 
this._http.get('https://unsplash.it/list') 
    .map(response => response.json()) 
    .subscribe(metaImages => { 
     const urls = metaImages.map(url => url.post_url); 
     this.imgSrc = urls[random(urls.length)]; 
    }); 

のようにそれを打破しかし、なぜまさに、これはありますか?助けてくれてありがとう。

+0

最初の.map()が応答オブジェクトをjsonオブジェクトに変換するのはなぜですか。 –

答えて

3

観測可能なエミッションストリームをマッピングするオブザーバブルと、配列の要素をマッピングする配列のマッピングを混同しないように注意してください。あなたのケースでは、サブスクライブする前に観測レベルでマッピングしたい場合、観測マップは放出の配列マッピングを行う必要があります。

const random = max => Math.floor((Math.random() * max) + 1); 
this._http.get('https://unsplash.it/list') 
    .map(response => response.json()) 

    .map(metaImages => metaImages.map(url => url.post_url)) 
    ^^^ MAP EMITTED ARRAY  ^^^ MAP ELTS IN EMITTED ARRAY 

    .subscribe(urls => this.imgSrc = urls[random(urls.length)]); 
+0

迅速かつ明確な説明をありがとう! @トーラザブロ –

関連する問題