angular firebase 处理创建流
angular firebase handling create flow
我正在使用 angular 和 firebase 实时数据库。我有一个应用程序正在处理订单的付款。当前代码如下所示
我的 ionic 页面 .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)
}
)
}
我有几个questions/problems:
1. startPayment 应该能够等到 createOrder 完成,这样我就可以向用户显示一条消息,说明订单处理成功。我如何 return 从 createOrder 服务功能中实现这一点?
创建订单做两件事:创建一个订单供卖家处理,同时创建一个针对放置用户的用户的交叉条目,以便他可以在他的历史记录中看到它。基本上订单数据因此而重复。这是正确的做法吗?如果没有那我该怎么办?
创建命令正在做上面提到的两件事。如果第一次或第二次操作失败,我该如何处理?我如何确保不会以损坏的数据告终?
只是return的承诺。在伪代码中:
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 运算符来处理流中的错误。
我正在使用 angular 和 firebase 实时数据库。我有一个应用程序正在处理订单的付款。当前代码如下所示
我的 ionic 页面 .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)
}
)
}
我有几个questions/problems: 1. startPayment 应该能够等到 createOrder 完成,这样我就可以向用户显示一条消息,说明订单处理成功。我如何 return 从 createOrder 服务功能中实现这一点?
创建订单做两件事:创建一个订单供卖家处理,同时创建一个针对放置用户的用户的交叉条目,以便他可以在他的历史记录中看到它。基本上订单数据因此而重复。这是正确的做法吗?如果没有那我该怎么办?
创建命令正在做上面提到的两件事。如果第一次或第二次操作失败,我该如何处理?我如何确保不会以损坏的数据告终?
只是return的承诺。在伪代码中:
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 运算符来处理流中的错误。