打字稿的通用处理承诺响应/错误

时间:2017-01-11 06:40:08

标签: typescript error-handling promise

我有许多函数在返回promise时执行完全相同的操作。 this.client是一组API调用的包装器,它们返回响应或错误。我希望以同样的方式处理这些问题。

任何想法都可以将这些方法中的每一种都减少为一个衬里吗?

  getHealthCheck() {
    return this.client.tools.healthcheck().then((response) => {
      return {success: true, result: response};
    }).catch((err) => {
      return {success: false, err: err };
    });;
  }

  createUser(data) {

    return this.client.users.create(data).then((response) => {
      return {success: true, result: response};
    }).catch((err) => {
      return {success: false, err: err };
    });;

  }

  createCardAccount(data) {
    return this.client.cardAccounts.create(data).then((response) => {
      return {success: true, result: response};
    }).catch((err) => {
      return {success: false, err: err };
    });;
  }

  createBankAccount(data) {
    return this.client.bankAccounts.create(data).then((response) => {
      return {success: true, result: response};
    }).catch((err) => {
      return {success: false, err: err };
    });;
  }

  makePayment(data) {
    return this.client.items.makePayment(data).then((response) => {
      return {success: true, result: response};
    }).catch((err) => {
      return {success: false, err: err };
    });;
  }

2 个答案:

答案 0 :(得分:2)

为什么不将响应提升到另一种类型:

type Success<T> = {success: true, result: T};
type Failure = {success: false, err: Error};
type Result<T> = Success<T> | Failure;
const Result = {
  from<T>(promise: Promise<T>): Promise<Result<T>> {
    return promise
           .then(result => ({success: true, result}))
           .catch(err => ({success: false, err}));
  }
}

然后您可以这样使用它:

return Result.from(this.client.tools.healthcheck());

答案 1 :(得分:1)

你成功和错误的回调似乎是一样的.. 你可以这样做:

successHandler = (response:any)=>{
     return {success: true, result: response};
     }
errorHandler = (error:any)=>{
     return {success: false, err: err };
     }

并且针对您的所有要求,

 getHealthCheck() {
    return this.client.tools.healthcheck().then(this.successHandler).catch(this.errorHandler);
  }

// other calls

其DRY原则。