2016-09-16 12 views
2

私は最初の例がなぜ機能するのか混乱していますが、2番目の例はなぜそうではありません。私はそれがjsonを呼び出すと関係があると信じて、javascriptオブジェクトへの応答を解決しますか?だから、それはその機能に置かなければならない約束を返すのだろうか?私は3番目の例で投げられたエラーのためにこれを得ます。 #jsonは何を正確に行いますか?約束は#thenと#jsonでどのように機能しますか?

export const promiseErrorMiddleware = store => next => action => { 
    const url = action.url 
    const fetchName = action.fetchName 
    return Promise.resolve(fetch(url)).then((response) => { 
    return response.json() 
    }).then((data) => { 
    store.dispatch({data: data, needDirection: true, fetchName: fetchName }) 
    }) 
} 

//works 

export const promiseErrorMiddleware = store => next => action => { 
    const url = action.url 
    const fetchName = action.fetchName 
    return Promise.resolve(fetch(url)).then((response) => { 
    store.dispatch({data: response.json(), needDirection: true, fetchName: fetchName }) 
    }) 
} 

//doesn't work 

export const promiseErrorMiddleware = store => next => action => { 
    const url = action.url 
    const fetchName = action.fetchName 
    return Promise.resolve(fetch(url)).then((response) => { 
    console.log(resopnse.json()) 
    return response.json() 
    }).then((data) => { 
    store.dispatch({data: data, needDirection: true, fetchName: fetchName }) 
    }) 
} 

//throws error 
+1

'response.json()'は**約束**を返します。前回の例では、 'resopnse.json()'にタイプミスがあります。それがエラーの原因かもしれません。 –

+0

最初の例と3番目の例の違いは何ですか? 'Promise.resolve()'を使う目的は何ですか? – guest271314

答えて

7

response.json()約束を返します。あなたはすぐにその結果を使用することはできません、あなたは約束を解決するのを待つ必要があります。

また、Promise.resolve()を使用する必要はありません。 fetch()はすでに約束を返しています。

{data: data}の代わりに{data}と書くことができます。これはshorthand property namesと呼ばれます。

json()メソッドを2回呼び出すことができないため、3番目の例ではエラーが発生します。

+1

_ "3番目の例では、' json() 'メソッドを2回呼び出すことができないため、エラーがスローされます" _ Ahh、 '応答'は '.json()'メソッドを使って読み取られます。メソッドを2回呼び出すことはできませんが確実ですか?または、エラーをスローせずに進行中の読み込み中に再度呼び出すことはできませんか? – guest271314

+2

@ guest271314最初の呼び出しの約束が解決されたとしても、 'json()'をもう一度呼び出すことはできません。たとえば、 'fetch( 'http://httpbin.org/get').then(r => r.json()。then(()=> r))then(r => r.json() ) 'はChrome上で既に' read 'をスローし、Firefoxでは 'Body is already consumed .'をスローします。 –

+1

fetch( "http://httpbin.org/get").then(r => { var clone = r.clone(); r.json()。次に(json1 => console.log( "json2"、json2)) }) }) '' – guest271314

関連する問題