2016-11-23 2 views
4

私はPromiseをビルドして失敗関数を呼び出すと、エラーは約束のための.catch関数によって捕捉されるはずですか?しかし、console.logでは、まだキャッチされていません(.catch関数もトリガーされます)。どうして?それともこれは意図されていますか?私は概念的に間違ったものを得て、啓発されたいと思っています!Javascript Promise:キャッチされた例外がまだキャッチされていないとして記録されるのはなぜですか?

は、次の例を考えてみましょう:

var A = { 
    loadingPromise: null, 
    loadingPromiseFail: null, 
    loadingPromiseResolver: null, 

    init: function() { 
    this.loadingPromise = new Promise(
     function(resolve, fail) { 
     this.loadingPromiseResolver = resolve; 
     this.loadingPromiseFail = fail; 
     }.bind(this) 
    ); 

    this.loadingPromise.then(function(data) { 
     console.log('success'); 
    }.bind(this)); 

    this.loadingPromise['catch'](function(e, x) {  
     console.log('error', e); 
    }.bind(this)); 
    }, 

    doSomething: function() { 
    setTimeout(function(){ 
    this.loadingPromiseFail('404'); 
    }.bind(this), 1000); 
    } 

} 

A.init(); 
A.doSomething(); 

にconsole.log:

error 404 
uncaught exception: 404 

なぜ第二はありますか?また、ここで

https://jsfiddle.net/Paflow/4g7yj38b/6/

答えて

6

コード

this.loadingPromise.then(function(data) { 
    console.log('success'); 
}.bind(this)); 

のこのビットは何のキャッチを持っていないので、エラーはこれは、あなたが正しく約束を使用するようにコードを書くべきかである確かに

キャッチされないです

var A = { 
    loadingPromise: null, 
    loadingPromiseFail: null, 
    loadingPromiseResolver: null, 

    init: function() { 
    this.loadingPromise = new Promise(
     function(resolve, fail) { 
     this.loadingPromiseResolver = resolve; 
     this.loadingPromiseFail = fail; 
     }.bind(this) 
    ); 

    this.loadingPromise.then(function(data) { 
     console.log('success'); 
    }.bind(this)).catch(function(e, x) { 
     console.log('error', e); 
    }.bind(this)); 
    }, 

    doSomething: function() { 
    setTimeout(function() { 
     this.loadingPromiseFail('404'); 
    }.bind(this), 1000); 
    } 

} 

A.init(); 
A.doSomething(); 

https://jsfiddle.net/4g7yj38b/7/

ポイントは、あなたが約束を(実際に.catchと)複数の.thenを追加できること、であるあなたががそれぞれ「チェーン上.catchを持っている必要がありので...それぞれ「鎖」は、独立してこのコンソールエラーを回避するには、コードの残りの部分に実際の影響はありません。

+0

よろしくお願いします。ありがとう、私はcatch()関数をthen()同じレベルに存在するものがあります。おそらく私はいくつかのcatch()関数を追加することができ、失敗した場合にはすべてが呼び出されることを期待していました。私が思ったように、いくつかは概念的に誤解しています。それを説明してくれてありがとう! – Paflow

関連する問題