Javascript Promise:为什么捕获的异常仍被记录为未捕获的异常?

5
当我构建Promise并调用失败函数时,错误应该被Promise的.catch函数捕获,对吗?但是在console.log中,我仍然把它作为未捕获的错误(同时.catch函数也被触发)。为什么?这是有意的吗?我想我理解上出了些问题,希望得到启示!
考虑以下例子:
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/

1个回答

6
这段代码:
this.loadingPromise.then(function(data) {
  console.log('success');
}.bind(this));

没有陷阱,因此错误确实未被捕获

以下是正确使用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)).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/

关键在于,您可以向 Promise 添加多个 .then(以及 .catch)……每个 "链" 都是独立的,因此您应该在每个 "链" 上都有一个 .catch,以避免这个控制台错误,即使这对其他代码没有实际影响。


好的,谢谢。我没有想到catch()函数是附加在then()函数上的,而是存在于同一级别上。很可能我会期望你也可以添加多个catch()函数,在任何失败的情况下都会被调用。正如我所想的那样,这是一些概念上的误解。感谢您的解释! - Paflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接