2016-11-02 5 views
3

をトリガしない `.catch`コールバックは、私はネイティブの約束を使用して、次のコード持っている:私はそれを実行するとはなぜ

function getUser() { 
    return new Promise(function (resolve, reject) { 
     reject(); 
    }); 
} 

function changeUser() { 
    return new Promise(function (resolve, reject) { 
     return getUser().catch(function (responseData, test) { 
      console.log('boo error'); // this logs `boo error` 
      throw {}; 
     }); 
    }); 
} 

changeUser().then(function() { 
    console.log('done'); 
}).catch(function() { 
    console.log('error'); // this is not triggered 
}); 

を、console.log('error');とLST catchブロックは実行されません。何故ですか?ネイティブの約束の実装はQと異なっていますか?

+0

http://stackoverflow.com/questions/33445415/javascript-promises-reject-vs-throwこの –

答えて

3

あなたはchangeUserから返す約束をrejectことはありませんので。あなただけthrowgetUserから返された約束、そのチェーン内のカスケードのチェーン内INGのだが、changeUserに建設new Promiseには影響しません。

次のいずれかの

return new Promise(function (resolve, reject) { 
    return getUser().then(resolve, function (responseData, test) { 
     console.log('boo error'); // this logs `boo error` 
     reject(); 
    }); 
}); 

または:

function changeUser() { 
    return getUser().catch(function (responseData, test) { 
     console.log('boo error'); // this logs `boo error` 
     throw {}; 
    }); 
} 
+0

を見てください。しかし、getUser()によって返される約束ではありません。then( '約束が返されます。 'Q'ライブラリを使用して起こるように'新しいPromise'で? –

+0

いや、ECMAScriptの標準約束の実装では何も返すことができるようにエグゼキュータのために指定されていません。あなたは内、 'then'内にない「チェーンを更新する」ことができますコンストラクタ。http://www.ecma-international.org/ecma-262/6.0/#sec-promise-executor – deceze

+0

おかげで、その行動[この回答](http://stackoverflow.com/a/27716590/2545680 _The次程度)の話はその後句は、関数が返された約束の句は、_のみthen'方法 'に、執行には適用されません? –

2

あなたはchangeUser機能に2つの異なる約束チェーンを入れ子にしているため。 resolvereject機能は、このようにthrow {}ないバブルアップし、その関数で呼び出されることはありません。 Chromeでこれを実行すると、コンソールに「Uncaught promise」というメッセージが表示されます。

いずれかの方法でそれを修正:

return new Promise(function (resolve, reject) { 
    return getUser().catch(function (responseData, test) { 
     console.log('boo error'); // this logs `boo error` 
     throw {}; 
    }).then(resolve, reject); 
}); 

または完全return new Promise行を削除することもできます。

+1

'return new Promise'を削除する方が良い解決策です、imo –