2016-11-23 92 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