2017-09-22 11 views
0

でfetchの使い方:私は「[オブジェクトのオブジェクト]を返している私は非同期でフェッチして待っています使用して、このパブリックAPIを取得しようとしているが、フェッチ方法だ非同期/リターンを待つ[オブジェクトのオブジェクト]

クラスAPIを取得するために使用してmは:APIが返す

class FetchAnimalApi { 
    async getAnimalInfo(animal) { 
    const request = await fetch(`http://my_api_url.com/${animal}`); 
    const response = await request.json(); 

    return `${animal} goes like ${response.sound}`; 
    } 
} 

構造(動物がブタである場合):

{"color": "pink", "sound": "roinc"} 

私は別のファイルに私のクラスをインポートして、それを呼んでいるが:

const animals = new FetchAnimalApi(); 
console.log(animals.getAnimalInfo('pig')); 

私は間違っていますか?

EDIT:

が今私にconsole.log()私が印刷したい正確に何を示しているが、私は応答を返すとき、私はまだ、[オブジェクトのオブジェクト]を取得しています:

function getInfo() { 
    const animals = new FetchAnimalApi(); 

    return animals.getAnimalInfo('pig').then(result => result); 
} 

ながらデバッグすると、const request = await fetch(http://my_api_url.com/ $ {animal} )行が実行された直後に[オブジェクトオブジェクト]が画面に表示されていることがわかりました。

+0

'[オブジェクトのオブジェクト]を'という理由だけで、あなたの最終的な出力で文字列変換である可能性があります。出力を 'console.log()'すると、目的のオブジェクトが表示されます。テンプレートリテラルにオブジェクトを入れてプロパティを出力することはできません。また、 'getAnimailInfo()'は約束を返します。ですから、その約束から価値を得るためには、 'await'と' .then() 'のどちらかを使う必要があります。 – jfriend00

+0

@ jfriend00 _オブジェクトをテンプレートリテラルに入れて、プロパティを出力することはできません?どうしてそう思うの? – alexmac

+0

@alexmac:テンプレートリテラルは "引数"を文字列に変換するので、オブジェクトのデフォルトの文字列表現は '[object Object]'です。すなわち、プロパティのリストではありません。 –

答えて

2

この方法でconsole.log(animals.getAnimalInfo('pig'));に電話をかけることはできません。 animals.getAnimalInfoは約束を返します。結果を得るために、あなたはthenコールバックを使用する必要があります

const animals = new FetchAnimalApi(); 
animals 
    .getAnimalInfo('pig') 
    .then(result => console.log(result)); 
+0

OPはどこでも 'await'を使用しているので、答えは' .then() 'だけでなく' await'もオプションとして提供するべきでしょう。 – jfriend00

+0

私は 'async/await'で解決策を提案したかったが、この文脈では意味をなさない。 'getAnimalInfo()'の結果を出力するだけの新しい関数を作成してください... – alexmac

+0

少し助けてくれました!しかしまだ成功していない):私はさらに説明しない問題を編集した。 – Anna

関連する問題