2016-04-23 6 views
6

内の拒否機能を呼び出すときには問題のコードである「(約束で)キャッチされない」:ここにし、 'フェッチ方法

new Promise((resolve, reject) => { 
    const opts = { 
    credentials: 'same-origin', 
    }; 

    fetch(`/_api/myAPI`, opts) 
    .then((res) => { 
    if (!res.ok) { 
     reject(res); 
    } else { 
     ... 

実行がreject(res);に達したときに、URLは、401例外をスローした場合それは私がすなわち、.thenコールの後、それはまだ起こっ

fetch(`/_api/myAPI`, opts) 
    .then((res) => { 
    if (!res.ok) { 
     reject(res); 
    } else { 
     ... 
    }) 
    .catch((e) => { 
    console.log(e); 
    } 

.catchを追加した後でもUncaught (in promise)

をスローします。

なぜrejectがこの例外をスローし、どのように修正できますか?私の経験はjQuery.Promiseに限定されており、エラーハンドラ内のrejectはこのエラーを引き起こしません。

+2

new Promise((resolve, reject) => { const opts = { credentials: 'same-origin', }; fetch('/_api/myAPI', opts) .then((res) => { if (!res.ok) { return Promise.reject() } else { ... resolve(...); }) .catch((e) => { console.log(e); reject(); } } 
は[アンチパターン(http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do -i-avoid-it)。そして、ここで悪影響を引き起こします。 – estus

+0

@estus有益なコメントありがとう! –

答えて

9

約束を拒否している場合は、その操作全体をラッピングしているという約束を直ちに拒否するため、そのキャッチブロックには決して行きません。

類推:拒否と解決は、関数への復帰が約束することです。

あなたがしようとしていることは、以下のコードだと思います。ラッピングは、新しい約束に約束をフェッチ

+0

私はこのスレッドが古くなっていることは知っていますが、少なくともChromeでは、約束を拒否するとそのエラーが表示される可能性はありますか?私はそれが私が見ているものだと思う。私はすぐに拒否し、まだエラーを持っている約束は何もしないでそれを試してみました。他の誰かがこの行動を見ますか? –

+0

私はあなたも正しいと信じています。私のコードはキャッチに到達し、私は両方のエラーをスローし、promise.reject()を試してみました。どちらも私のためにこれをクロームで表示します。 –

関連する問題