2016-08-08 3 views
0

1) У меня есть конкретная реализация, где я хочу придерживаться принципов СУХОЙ. Структура обоих методов почти одинакова. Мне интересно, если это способ не повторять реализации: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); 
    }); 
Смежные вопросы