【问题标题】:angular firebase handling create flow角度 Firebase 处理创建流程
【发布时间】:2018-08-30 14:49:42
【问题描述】:

我正在使用 angular 和 firebase 实时数据库。我有一个应用程序为订单进行付款处理。当前代码如下所示

my ionic page .ts 在 paynow 按钮上调用如下:

  startPayment(){
        this.instamojoClient = new Instamojo(this.http, this.iab, 'XXX');
        var data = this.instamojoClient.getPaymentFields()

        this.instamojoClient.payNow(data).then(response => {

           //payment is successful now create a order for the customer
           this.ddlSvc.createOrder(this.core.order, this.core.user)
        }).catch(err => {
         console.log("Payment failed: " + JSON.stringify(err))
        });
      }

createOrder 如下所示

   createOrder(order:Order, customer:User){
        console.log("new technique to creating new order for #" + order.orderNumber)
        const itemRef = this.db.list('orders')
        const payload = {
          order: order,
          customer: customer
        }

        itemRef.push(payload).then(
          (data) => {
            const orderKey = data.key
             //create a cross entry in the user as well to maintain history
            const userRef = this.db.object('/users/' + customer.uid + "/orders/" + orderKey )
            userRef.set(order)
          }
        )  
      }

我有几个问题/问题: 1. startPayment 应该能够等到 createOrder 完成,以便我可以向用户显示订单成功处理的消息。我从 createOrder 服务函数返回什么来实现这一点?

  1. 创建订单有两件事情:创建订单供卖家处理,并针对放置用户的用户创建交叉条目,以便他可以在历史记录中查看。因此,基本上订单数据是重复的。这是正确的做法吗?如果没有,我该怎么办?

  2. 创建顺序执行上述两件事。如果第一次或第二次操作失败,我该如何处理?如何确保我不会得到损坏的数据?

【问题讨论】:

    标签: angular firebase firebase-realtime-database es6-promise angularfire2


    【解决方案1】:

    只需返回承诺。在伪代码中:

    startPayment().then()
    
    startPayment(): Promise {
       //...
       return payNow.then(() => {
           return createOrder();
       });
    }
    
    createOrder(): Promise {
        // ...
        return itemRef.push...
    }
    

    但是,您可以使用响应式模式让您的生活更轻松:

    startPayment.subscribe(() => {
        // success
    }, error => {
       // error
    })
    
    startPayment(): Observable<any> {
        return from(payNow()).pipe(
            switchMap(dataFromPayNow => createOrder(dataFromPayNow))
        );
    }
    
    createOrder(): Observable<any> {
        //...
        return from(itemRef.push()).pipe(
            switchMap(item => {
                return from(userRef.set());
            })
        )
    }
    

    您可以使用 catchError 运算符来处理流中的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2019-01-15
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多