【问题标题】:Issues with promise chaining in firebase realtime database triggerFirebase 实时数据库触发器中的 Promise 链接问题
【发布时间】:2019-06-01 06:39:28
【问题描述】:

在下面的代码中卡住了承诺链。

我的实时数据库有两个节点。用户和订单。 我有存储奖励金额的用户。创建新订单时,我有一个订单数据库触发器。我在创建触发器中的要求是从用户节点获取奖励金额并扣除订单金额,然后将新值更新回用户。

exports.on_order_received_deduct_doodle_cash = functions.database.ref("/orders/{id}")
.onCreate((change, context) => {

  const order = change.val();
  const customerObj = order.customer
  const orderObj = order.order
  const afterDiscount = orderObj._afterDiscount
  const uid = customerObj._uid

    var db = admin.database();
    const userRef = db.ref('users/')
    return userRef.child(uid).once("value").then(
        (resp) => {
              const userObj = resp.val()
              const doodleCash = userObj._doodleCash
              console.log("user current doodle cash is::" + doodleCash)
              return doodleCash
        }
    ).then(
        (doodleCash) => {

                if(doodleCash > afterDiscount){
                    const val = doodleCash - afterDiscount
                    return userRef.child(uid).update({"_doodleCash" : val})
                }else{
                    console.error("cannot be a negative value")
                    return null
                }

        }
    ).catch(
        (err) => console.error("something went wrong:" + err)
    )
})

这是将值从第一个承诺传递给另一个承诺的正确方法吗?

【问题讨论】:

    标签: firebase firebase-realtime-database promise google-cloud-functions


    【解决方案1】:

    以下应该可以解决问题。

    您应该在您的第一个 then() 中返回一个承诺,或者一个向平台表明云函数已完成的值(如 null)。

    exports.on_order_received_deduct_doodle_cash = functions.database.ref("/orders/{id}")
    .onCreate((change, context) => {
    
      const order = change.val();
      const customerObj = order.customer
      const orderObj = order.order
      const afterDiscount = orderObj._afterDiscount
      const uid = customerObj._uid
    
        var db = admin.database();
        const userRef = db.ref('users/')
        return userRef.child(uid).once("value").then(
            (resp) => {
                  const userObj = resp.val()
                  const doodleCash = userObj._doodleCash
                  console.log("user current doodle cash is::" + doodleCash)
    
                  if (doodleCash > afterDiscount) {
                        const val = doodleCash - afterDiscount
                        return userRef.child(uid).update({"_doodleCash" : val})
                    }else{
                        console.error("cannot be a negative value")
                        return null;
                    }
            }
        ).catch(
            (err) => console.error("something went wrong:" + err)
        )
    })
    

    【讨论】:

    • 对于这种情况,这也是正确的还是推荐的方法?
    • 嗯...恕我直言,我认为这是正确的方法之一,这就是我写答案的原因!! :-)
    • 等一下。当时我在手机上,所以没有正确阅读您的回复。你的反应不是那么连锁。我一直在寻找的是如何做然后链接。如果我最终基于 db 上的先前 crud 做了更深层次的事情,代码会变得更加混乱。
    • 对我的评论有什么想法吗?
    • 如果你想链接 Promises 我认为你应该在每个 then() 中返回一个 Promise。
    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 2022-06-10
    • 2023-03-06
    • 2021-07-01
    • 2021-04-09
    • 1970-01-01
    • 2019-01-19
    • 2021-02-05
    相关资源
    最近更新 更多