题:
我想仅在收费成功的情况下才对我的数据库进行更改。
目前情况并非如此。在充电完成处理之前触发ARef.push(object)
。
我的语法有什么问题?
码:
router.post("/", (req, res) => {
var amount = req.body.amount;
var object;
var ARef = admin.database().ref("ref");
var ARefList;
amount = amount * 100;
var object = {
amount: amount,
email: email,
inversedTimeStamp: now
}
stripe.customers.create({
email: req.body.stripeEmail,
source: req.body.stripeToken
})
.then(customer =>
stripe.charges.create({
amount: amount,
description: "desc",
currency: "usd",
customer: customer.id
})
)
.then(charge =>
ARef.transaction(function(dbAmount){
if (!dbAmount) {
dbAmount = 0;
}
dbAmount = dbAmount + amount/100;
return dbAmount;
})
)
.then(
// this happens regardless of the success of the charge
ARef.push(object)
//
)
.then (
ARefList.push(object)
)
.then(
res.render("received",{amount:amount/100})
);
});
在这些方面:
.then(
// this happens regardless of the success of the charge
ARef.push(object)
//
)
.then (
ARefList.push(object)
)
你正在调用ARef.push
并将其返回值传递给then
。这样就会在链条建立时发生,而不是在它被解决/拒绝时发生。
要将它们作为解析链的一部分进行调用,请传入函数,而不是push
的结果:
.then(() => {
ARef.push(object)
//
})
.then (() => {
ARefList.push(object)
})
同样,这看起来很可疑:
.then(charge =>
ARef.transaction(function(dbAmount){
if (!dbAmount) {
dbAmount = 0;
}
dbAmount = dbAmount + amount/100;
return dbAmount;
})
)
ARef.transaction
看起来并不会返回一个承诺,但它确实接受了一个回调,暗示它是异步的(尽管这不是接受回调的唯一原因)。如果它没有提供承诺,您可能必须创建自己的:
.then(charge =>
new Promise((resolve, reject) => {
ARef.transaction(function(dbAmount){
// How do you know whether this failed? However it is,
// ensure you call `reject` when it does.
if (!dbAmount) {
dbAmount = 0;
}
dbAmount = dbAmount + amount/100;
resolve(dbAmount); // <== Resolve with whatever value should
// go to the next link in the chain
})
})
)
回到第一部分:
但是,目前尚不清楚object
的来源。如果它是上面第一个then
回调将获得的分辨率值,那么:
.then(object => {
ARef.push(object)
//
})
.then (() => {
ARefList.push(object)
})
同样,如果下一个then
处理程序要接收它,那then
处理程序将需要返回一些东西:
.then(object => {
ARef.push(object)
return object;
})
.then (object => {
ARefList.push(object)
})
那,或结合这两个处理程序:
.then(object => {
ARef.push(object)
ARefList.push(object)
})
看起来你想要这样做 - 。然后需要一个回调fn:
() => aRef.push(object)