反应本机干Javascript

反应本机干Javascript,javascript,react-native,Javascript,React Native,1) 我有一个具体的实施,我想坚持干燥的原则。 这两种方法的结构几乎完全相同。我想知道这是否是一种避免重复实施的方法: addCardToExistingCustomer(cardDetail){ PaymentUtil.stripeCreateCardToken(cardDetail).then((cardTokenResult)=>{ if(cardTokenResult.error){ console.log("There was an error

1) 我有一个具体的实施,我想坚持干燥的原则。 这两种方法的结构几乎完全相同。我想知道这是否是一种避免重复实施的方法:

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) 这是连锁承诺的最佳方式吗?具体来说,您应该如何处理链中承诺的例外情况,这些承诺不是链的最后一个元素

比如说promise
GetStripeCustomeId
rejected。你应该如何处理拒绝

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)); 
},

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获取承诺链上的错误。您可以查看上面的代码。我添加了catch以获取cardtokenresult错误。您可以在链上以相同的方式继续,以获得其他错误。

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获取承诺链上的错误。您可以查看上面的代码。我添加了catch以获取cardtokenresult错误。您可以在链上以相同的方式继续,以获得其他错误。

我注意到您正在检查
的第一个参数中的错误,然后检查
。我很确定这是不正确的,因为Stripe不会在出现错误时返回HTTP200状态

话虽如此,我还是喜欢扁平化链式承诺,而不是嵌套它们,因为我发现这样可以使代码更易于维护和阅读:

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);
    });

我注意到您正在检查
的第一个参数中的错误,然后是
。我很确定这是不正确的,因为Stripe不会在出现错误时返回HTTP200状态

话虽如此,我还是喜欢扁平化链式承诺,而不是嵌套它们,因为我发现这样可以使代码更易于维护和阅读:

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);
    });