2016-04-05 4 views
3

以下は例である:コードについてJavascriptの約束では、なぜエラーが次のチェーン `.catch()`に渡されないのですか?

var promise = new Promise(function(resolve, reject) { 
    throw new Error('test'); 
}); 
promise.catch(function(error) { 
    console.log(error + ' 1 '); 
    return error 
}).catch(function(error) { 
    console.log(error + ' 2 '); 
    return error 
}) 

結果は次のとおり

Error: test 1 

分かるように、第二catch呼び出しが動作しません。これは、Promiseがcatchのチェーン構文を使用してエラーを処理できないことを意味しますか?現在のエラーを次のcatch()コールに渡す方法はありますか?

+3

エラーは再発しません。何故戻り値が捕捉されると見なされるのでしょうか?代わりに 'throw error;'を使用すると、期待する動作が得られるはずです。 – Luaan

+0

可能な複製http://stackoverflow.com/questions/35042068/why-is-onrejected-not-called-following-promise-all-where-promise-reject-incl – guest271314

+0

もしあなたが* catch *から何かを返すならばあなたは問題を処理したと言いますが、これは継続する価値です。あなたが問題を処理していない場合は、*返すのではなく* rethrow *。 –

答えて

7

エラーを返しても、それ以降はcatchになることはありません。あなたは再びエラーがthrowする必要があります。

promise.catch(function(error) { 
    console.log(error + ' 1 '); 
    throw error 
}).catch(function(error) { 
    console.log(error + ' 2 '); 
    return error 
}) 
-> Error: test 1 
-> Error: test 2 
3

あなただけのエラーオブジェクトを返すとは対照的に、再びエラーをスローする必要があります。

var promise = new Promise(function(resolve, reject) { 
    throw new Error('test'); 
}); 
promise.catch(function(error) { 
    console.log(error + ' 1 '); 
    throw error 
}).catch(function(error) { 
    console.log(error + ' 2 '); 
    return error 
}) 

jsのは、この「のない内部概念はありませんエラーオブジェクトなので投げてください " - 最初のcatch()に続いてthen()句があった場合、そのように操作が延期されました。

var promise = new Promise(function(resolve, reject) { 
    throw new Error('test'); 
}); 
promise.catch(function(error) { 
    console.log(error + ' 1 '); 
    return error 
}).then(function(error) { 
    console.log(error + ' 2 '); 
    return error 
}) 

希望すると便利です。

+0

"これはエラーオブジェクトなので投げられる"機能はどういう意味か、それは何を意味するのだろうかと思う。 –

+0

@ T.J.Crowder私は私の言葉を編集して、 –

関連する問題