【问题标题】:How to execute a function only once a Promise is done?仅在完成 ​​Promise 后如何执行功能?
【发布时间】:2018-05-31 04:05:45
【问题描述】:

问题:

只有在收费成功的情况下,我才想对我的数据库进行更改。

目前情况并非如此。 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})
    );
});

【问题讨论】:

  • @T.J.Crowder 抱歉。我删除了那部分代码,因为它在这里不相关:/我的问题是 ARef.push(object) 在条带承诺完成处理费用之前触发。
  • 哪个代码“处理收费”?那个stripe.charges.create 的东西?它会返回一个承诺吗?
  • .then 无论promise是失败还是成功都会被执行。这就是你的想法吗?
  • @TheProgrammer:好的。不过,它看起来不正确,FWIW。
  • @T.J.Crowder 我认为你一定是对的:我只是想一次修复我的代码。

标签: javascript jquery html promise stripe-payments


【解决方案1】:

在这些行中:

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

【讨论】:

  • 对不起,“对象”的混淆,我忘记了 var,它不是返回值
  • @TheProgrammer:不用担心。我在上面添加了一个关于ARef.transaction 的注释。 HTH。
【解决方案2】:

看起来你想这样做 - .then 需要回调 fn:

() => aRef.push(object)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多