2017-01-11 47 views
0

我有許多函數都會在返回promise時執行完全相同的操作。 this.client是一組API調用的包裝,它們返回響應或錯誤。我希望以同樣的方式處理這些問題。typecript promise的一般處理答覆/錯誤

任何想法,我可以減少每個這些方法到一個襯裏?

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

爲什麼不只是解除響應轉換成另一種類型:

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()); 
+0

我試圖實現類似的東西,下面的文檔:HTTPS:/ /www.typescriptlang.org/docs/handbook/generics.html 這實際上改變了我在未來TS中的方法。真的很感謝你分享。 –

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原則。