处理类构造函数中的承诺错误[重复]

Posted

技术标签:

【中文标题】处理类构造函数中的承诺错误[重复]【英文标题】:Handle promise error in class constructor [duplicate] 【发布时间】:2020-04-22 15:43:15 【问题描述】:

我的类构造函数调用了一个连接到服务的承诺。如果连接失败,如何捕获错误?我创建类实例的调用被包装在一个 try catch 块中,但它没有从 promise 中得到错误。像这样……

const client = require('aService')

trylet s = new Service()
catch(e)console.log(`instance error $e`)

class Service

    constructor()
      this.connection = client.login()
         .then()
            ...
          
         .catch(e=>
            console.log(`promise error $e`
            return e
           )
    

控制台会记录“promise error”,但不会记录“instance error”,我需要这样才能干净利落地处理类实例失败。

非常感谢

【问题讨论】:

【参考方案1】:

Promise 已分配给 this.connection,但您在构造函数中 .catching 错误。只有当您可以对它做某事时才能更好地捕捉错误 - 也就是说,在外部Service 的消费者中。因此,只需将 .catch 从构造函数移动到您创建服务的正下方:

const client = require('aService')

class Service 
  constructor() 
    this.connection = client.login()
      .then(() => 
        // ...
      );
  



let s = new Service()
s.connection.catch((e) => 
  console.log(`connection error $e`)
);

或者使用awaittry/catch:

const client = require('aService')

class Service 
  constructor() 
    this.connection = client.login()
      .then(() => 
      // ...
    );
  



(async () => 
  let s = new Service()
  try 
    await s.connection;
    // connection done
   catch(e) 
    console.log(`connection error $e`)
  
)();

【讨论】:

以上是关于处理类构造函数中的承诺错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bluebird 在构造函数构建的“类”上承诺导出的函数

如何在模板类之外定义构造函数[重复]

在派生构造函数中的某些代码块之后调用派生类中的基类构造函数[重复]

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

非模板类的模板构造函数出现问题[重复]

扩展 Javascript 承诺并在构造函数中解决或拒绝它