2017-05-31 19 views
0

フェッチを使用して変数と関数を理解する際に問題があります。 私はJavascript - 応答が定義されていませんフェッチ

.then(response => response.json()) 

から

.then(lang => response['lang'].slice(-2) 

に応答の値を渡すためにしようとしている。しかし、私は未定義の変数応答エラーを取得していますので、私は正しく変数を参照していませんよ。それを呼び出す正しい方法は何ですか?

また、両方のコンソールログを呼び出すと、以下のコードが現時点では機能しますが、応答関数を上書きする必要があるとは思われません。引数なしで関数を呼び出すことはできますか?

.then(response => console.log(response['text']) & console.log(food)) 

はconsole.log(レスポンス[ 'テキスト'])&はconsole.log(食品)

fetch("https://localhost:8000", {method:"POST", body:fd}) 
    .then(response => response.json()) 
    .then(lang => response['lang'].slice(-2)) 
    .then(food => "Temporary") 
    .then(function detectType(lang) { 
    switch(lang) { 
    case 'abc': 
     food = "Bananas"; 
     break; 
    case 'def': 
     food = "Apples"; 
     break; 
    default: 
     food = "Bananas"; 
     break; 
    }}) 
    .then(response => console.log(response['text']) & console.log(food)) 
    .catch(err => console.error(err)); 
} 
+0

なぜ、関数 'lang'のパラメータに名前を付けましたか?あなたはそれで何もしていません。 '.then(response => response ['lang']。slice(-2))'(ただし、あなたが何をパラメータと呼んでもかまいません)でなければなりません。パラメータは、定義されている関数でのみアクセスできます。また、[JavaScriptの変数の範囲は何ですか?](https://stackoverflow.com/q/500431/218196) –

+0

これをパラメータに設定すると、レスポンス['text']を呼び出そうとするとどうなりますか?これは{'text': 'a'、 'lang': 'b'}のような種類のjson辞書です – Juanvulcano

+0

"呼び出し"によって単に "アクセス"を意味するならば、文字列 ''a'を返します。例: 'var foo = {text: 'a'}; console.log(foo ['text']); '。 –

答えて

1

私はあなたが何をしたいのか理解していた場合は、あることに注意して戻り値を保ちますある関数の次の関数が受け取った状態です。だから、もっとこのような何かを探しているはずだ:

fetch()について
fetch("https://localhost:8000", {method:"POST", body:fd}) 
    .then(response => response.json()) 
    .then(response => { 
    response['lang'] = response['lang'].slice(-2); 
    return response; 
    }) 
    .then(response => { 
    response['food'] = "Temporary"; 
    return response; 
    }) 
    .then(function detectType(response) { 
    switch(response['lang']) { 
     case 'abc': 
      response['food'] = "Bananas"; 
      break; 
     case 'def': 
      response['food'] = "Apples"; 
      break; 
     default: 
      response['food'] = "Bananas"; 
      break; 
    } 
    return response; 
    }) 
    .then(response => { 
    console.log(response['text']); 
    console.log(response['food']); 
    }) 
    .catch(err => console.error(err)); 
} 
1

、それは非常に「重い約束」であることを覚えておいてください。

fetch("https://localhost:8000", {method:"POST", body:fd})あなたは次の.then()であなたのresponse.json()の状態を与えるresponse.json()を返す最初のthen()

then(response => response.json())で扱うの約束を返します。したがって、あなたは次のthen()によって応答のJSON表現にアクセスできます。

のは、それがどのように見えるべきかを見てみましょう:その最後の行で

fetch("https://localhost:8000", {method:"POST", body:fd}) 
    .then(response => response.json()) 
    .then(jsonResp => jsonResp['lang']); 

、あなたは約束のチェーンを下ることなく、JSONオブジェクトとそのキーを確認することができます。 lang属性をチェックする場合は、例のようにアクセスできます。

希望すると便利です。

+0

* "' response.json() 'がPromiseを返すので" *いいえ、それは理由ではありません。 .then' *常に*約束を返します。おそらく*コールバック*が約束を返すということでしょうか?その場合、あなたは正しいです。 –

+0

それを入手して固定しました。ありがとうございました! –

関連する問題