Проблемы с цепочкой обещаний в триггере базы данных Firebase в реальном времени - PullRequest
0 голосов
/ 06 января 2019

Застрял в цепи обещаний в моем коде ниже.

В моей базе данных реального времени есть два узла. пользователи и заказы. У меня есть пользователи, где хранится сумма вознаграждения. У меня есть триггер БД на заказы, когда создается новый заказ. Мое требование в триггере создания - получить сумму вознаграждения от узла пользователей и вычесть сумму заказа, а затем обновить новое значение для пользователей.

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

это правильный способ передать значение из первого обещания другому?

1 Ответ

0 голосов
/ 06 января 2019

Следующее должно сделать трюк.

Вы должны вернуть обещание в своем первом 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)
    )
})
...