угловая пожарная обработка создает поток - PullRequest
0 голосов
/ 30 августа 2018

Я использую угловой с базой данных реального времени Firebase. У меня есть приложение, которое выполняет обработку платежей для заказа. Текущий код выглядит следующим образом

Моя ионная страница .ts вызывается при нажатии кнопки, как показано ниже:

  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. Порядок создания выполняет 2 вещи, как упомянуто выше. Как мне справиться, если первая или вторая операция не удалась? Как я могу убедиться, что у меня нет поврежденных данных?

1 Ответ

0 голосов
/ 30 августа 2018

Просто верните обещание. В псевдокоде:

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 для обработки ошибок в потоке.

...