Javascript Promise:为什么被捕获Exception仍然记录为未捕获?

Paf*_*low 4 javascript 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();
Run Code Online (Sandbox Code Playgroud)

的console.log:

error 404
uncaught exception: 404
Run Code Online (Sandbox Code Playgroud)

为什么是第二个?

也在这里:https: //jsfiddle.net/Paflow/4g7yj38b/6/

Jar*_*a X 6

这段代码

this.loadingPromise.then(function(data) {
  console.log('success');
}.bind(this));
Run Code Online (Sandbox Code Playgroud)

没有捕获,所以错误确实没有被捕获

这就是你应该编写代码以正确使用Promises的方法

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();
Run Code Online (Sandbox Code Playgroud)

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

关键是,你可以添加多个.then(实际上是.catch)到Promise ...每个"链"是独立的,所以你应该在每个"链"上有一个.catch来避免这个控制台错误,即使这对其余代码没有实际影响