2017-08-14 4 views
0

私は約束を読んでいて、フェッチして本当に混乱した。 Introduction to fetchから次のコードを取得しました。拒絶されたときに約束しているが、その後しか黙示していない

質問:statusが拒否された場合はどうなりますかpromisethen(json)then(status)の後にチェーンされています。then(json)then(json)が実行されてから解決された約束を返すので何もしませんか?それとも、チェーンがちょうどthenのすべてを通過し続けていて、ステータスが返されて約束が拒否された場合は、最後にcatchに到達し、catchはエラーをキャッチしますか?

私が間違っていた場合、このコードの正しい解釈は何ですか?約束は、それはチェーンの他に何も実行せず.catch()に直接行く拒否され

function status(response) { 
    if (response.status >= 200 && response.status < 300) { 
    return Promise.resolve(response) 
    } else { 
    return Promise.reject(new Error(response.statusText)) 
    } 
} 

function json(response) { 
    return response.json() 
} 

fetch('users.json') 
    .then(status) 
    .then(json) 
    .then(function(data) { 
    console.log('Request succeeded with JSON response', data); 
    }).catch(function(error) { 
    console.log('Request failed', error); 
    }); 
+0

以下「?*と、そのステータスが解決約束*をreturnes場合にのみ実行されます(JSON)、その後(JSON)は、それ以来何もしないという意味ではありません」 'json')は、約束が失敗したときに実行されません。しかし、何かが起こります。返される '.then(...) 'が拒否され、エラーが伝播するという約束です。 "*そうであれば、ステータスが拒否された約束を返すならば、チェーンはすべてのthensをそのまま通過し続けます。 – Bergi

+0

'.then(status)'ステージが拒否された場合、 'onRejected'コールバックを' .then(json、onRejected) 'ステージに追加するだけで、拒否された約束を以前に処理し、もう一度試してみるなどの処置を取ることができます。 。 – Redu

答えて

1

、私は二つの鎖として.thenチェーンを考え...成功と拒否

拒絶またはエラーが成功から「ジャンプ」し、「実行」を引き起こし拒否

への拒否ハンドラが拒否されていない値は、「実行」は成功チェーン

ノートに「ジャンプ」になる、と約束返す場合:約束に私の最も初期の暴露には.catchを持っていました... .thenは実際には2つの引数を受け入れるので、onFullfilledonRejected - これらのいずれかが、それは無視さfunctionでない場合 -

ので、以下のように、あなたのコードを書くことができます。

function status(response) { 
    if (response.status >= 200 && response.status < 300) { 
    return Promise.resolve(response) 
    } else { 
    return Promise.reject(new Error(response.statusText)) 
    } 
} 

function json(response) { 
    return response.json() 
} 

function log(data) { 
    console.log(data); 
} 

function handleError(error) { 
    console.log('Request failed', error); 
} 

fetch('users.json') 
    .then(status, null) 
    .then(json,  null) 
    .then(log,  null) 
    .then(null,  handleError); 

今では「上、機能の統計情報にエラーを与えていることはかなり明らかです『効果「チェーンである』(私は本当に良く用語を考える必要がある)、そして何が一番下までrejectチェーンでありませんので、それはいくつかに

.catchを実行されます、次のコードだ拒否プロミスライブラリiはい、成功コールバック( - sが単に

Promise.prototype.catch = function catch(onRejected) { 
    return this.then(null, onRejected); 
}; 
0

したがって、statusPromise.rejectを返した場合、catch関数だけが実行されます。約束を理解しようとしているの私の初期の頃には

関連する問題