2016-11-23 98 views
4

當我建立我的諾言,並調用函數失敗,錯誤應該由許權.catch功能抓到?但在console.log中,我仍然將它作爲未捕獲的(也會觸發.catch函數)。爲什麼?或者這是打算?我覺得我在概念上有點不對勁,想要開悟!Javascript的承諾:爲什麼被捕獲的異常仍記錄爲未捕獲?

請看下面的例子:

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)......每一個「鏈」是獨立的,所以你應該每個「鏈.catch 「爲了避免這種控制檯錯誤,即使這對代碼

+0

好吧其餘沒有真正的影響,謝謝我沒想到的漁獲() - 函數的東西附加到那麼() - 功能,但在同一級別存在的東西。我很可能會預料到,你也可以添加幾個catch()函數,並且在任何失敗的情況下,所有的函數都會被調用。正如我的想法,一些概念上的誤解。謝謝你的解釋! – Paflow