2016-08-08 153 views
0

1)我有一個特定的實現,我想堅持DRY原則。 這兩種方法的結構幾乎完全相同。我想知道這是否是一種不重複執行的方式:React Native DRY Javascript

addCardToExistingCustomer(cardDetail){ 
    PaymentUtil.stripeCreateCardToken(cardDetail).then((cardTokenResult)=>{ 
     if(cardTokenResult.error){ 
     console.log("There was an error with the card!"); 

     } else { 
      PaymentUtil.addCardToExistingCustomer(cardTokenResult.id).then((card) =>{ 


      }); 
     } 
    }); 
    } 

    addCardToNewCustomer(cardDetail){ 
    this.stripeCreateCardToken(cardDetail).then((cardTokenResult)=>{ 
     if(cardTokenResult.error){ 
     console.log("There was an error with the card!"); 

     } else { 
     console.log("Successfully created card token"); 
     PaymentUtil.stripeCreateCustomer(cardTokenResult.id) 

     } 
    }); 
    } 

2)這是鏈接承諾的最佳方式嗎?具體而言,您應該如何處理鏈條中不屬於鏈條最後要素的承諾中的例外情況。

說例如承諾getStripeCustomerId拒絕。你應該如何處理拒絕。

addCardToExistingCustomer(cardTokenResultId){ 
    return this.getStripeCustomerId(userDetail).then((customerId) => { 
      return this.removeAllExistingCards(userDetail).then(()=>{ 
        return Stripe.addCardToCustomer(cardTokenResultId,customerId); 
      }); 
     });  
}, 


getStripeCustomerId(userDetail){ 
    return FirebaseRESTUtil.getStripeCustomer(userDetail.username) 
     .then((fbStripe) => (fbStripe.customerId)); 
}, 

回答

3

1-這種方式可以更好。它將使用承諾鏈來處理數據。

getCardTokenResult(cardDetail) { 
    return PaymentUtil.stripeCreateCardToken(cardDetail) 
    .then((cardTokenResult) => { 
     if(cardTokenResult.error){ 
     return Promise.reject('There was an error with the card!!'); 
     } else { 
     return cardTokenResult; 
     } 
    }) 
    .catch((error) => console.log(error)): 
} 

addCardToExistingCustomer(cardDetail){ 
    return getCardTokenResult(cardDetail) 
    .then((cardTokenResult) => { 
     PaymentUtil.addCardToExistingCustomer(cardTokenResult.id).then((card) =>{ 
     // do something 
     }); 
    }); 
} 

addCardToNewCustomer(cardDetail){ 
    return getCardTokenResult(cardDetail) 
    .then((cardTokenResult) => { 
     PaymentUtil.stripeCreateCustomer(cardTokenResult.id); 
    }); 
} 

2 - 您可以使用得到諾言鏈的錯誤。你可以看看上面的代碼。我加了catch來得到cardtokenresult錯誤。你可以在鏈上繼續相同的方式來獲得其他錯誤。

0

我注意到您正在檢查您的then的第一個參數中的錯誤。我很確定這是不正確的,因爲Stripe不會在錯誤時返回HTTP 200狀態。

說了這麼多,我想拉平鏈接的承諾,而不是嵌套他們,因爲我發現它使代碼更易於維護和閱讀:

addCardToExistingCustomer(cardTokenResultId) { 
    return this.getStripeCustomerId(userDetail).then((customerId) => { 
     return this.removeAllExistingCards(userDetail); // returns a promise 
    }).then(() => { 
     return Stripe.addCardToCustomer(cardTokenResultId,customerId); // returns a promise 
    });  
}, 

現在,任何錯誤都會泡到主外承諾,所以你可以通過檢查錯誤

addCardToExistingCustomer(myId).then(() => { 
     console.log('success!'); 
    }, (error) => { 
     console.log(error); 
    });