当前位置: 首页 > 知识库问答 >
问题:

如何在firebase事务api上处理空值

夏侯枫
2023-03-14

我有一个函数,是递减用户信用的firebase实时数据库值与事务。正如Firebase事务API调用中所建议的,当前数据为空事务当前值偶尔返回为空。

function charge(cost, description) {
  return new Promise((resolve, reject) => {
    const creditRef = db.ref(`credits/${userid}`)
    ref.transaction(function(current) {
      console.log(`${description} current value: ${current}`)
      if (current === null) {
        console.log(`${description} returns 0 `)
        return 0
      }
      if (cost > current || current === 0) {
        //not enough credits return without committing
        console.log(`${description} aborts `)
        return
      }
      //commit the new credit value
      console.log(`${description} returns ${current} - ${cost}`)
      return current - cost
    },
    (error, commited, snapshot) => {
      if (error) {
        reject(error)
      }
      else {
        if (commited) {
            //user has enough credits
            resolve()
        }
        else {
            //not enough credits
            reject('no commit')
        }
    }
  })
}
// User has 5 credits 
charge(3, 'first call').then(() => console.log('first call success')
// transaction function returns 0 since current value is null
charge(2, 'second call').then(() => console.log('second call success')

第二次调用当前值:0

第二次调用中止

首次调用电流值:5

第一次呼叫返回5-3

首次呼叫成功

第二次调用不提交

因此,当用户有足够的信用时,第二个收费电话最终没有通过。处理firebase事务空值情况的正确方法是什么?

共有1个答案

廖华翰
2023-03-14
const ref = firebase.database().ref(`59571450`)
function charge(cost, description) {
  return new Promise((resolve, reject) => {
    ref.transaction(function(current) {
      console.log(`${description} current value: ${current}`);
      if (current === null) {
        console.log(`${description} returns null`)
        return null;
      }
      if (cost > current) {
        //not enough credits return without committing
        console.log(`${description} aborts `)
        return
      }
      //commit the new credit value
      console.log(`${description} returns ${current} - ${cost}`)
      return current - cost
    },
    (error, commited, snapshot) => {
      if (error) {
        reject(error)
      }
      else {
        if (commited) {
            //user has enough credits
            resolve()
        }
        else {
            //not enough credits
            reject('no commit')
        }
      }
    });
  });
}
                     

ref.set(5).then(() => {
  charge(3, 'first call').then(() => console.log('first call success'))
  charge(2, 'second call').then(() => console.log('second call success'))
})

第二次呼叫成功

有关此代码的工作版本,请参见:https://jsbin.com/xefebul/1/edit?js,console

 类似资料:
  • 我有一个可以监听Firebase实时数据库中的任何值更改。在线模式下,一切正常。 但在脱机模式下,设备处于脱机状态,我的Web服务器在Firebase实时数据库上完成了多个事务,其值与我从Android中输入的侦听器的值相同。设备联机后,它将只侦听最后一个事务,并跳过其间完成的其他事务。 PFB参考链接。到目前为止我已经完成的PFB代码:

  • 问题内容: 我们有一个用于生成唯一数字键的表。这些键然后用作其他表中的PrimaryKey。表结构是这样的: 所以我们在这个表中有数据 所以,当我们需要下一个主键表中我们可以得到从这个表,其中是,它会给我们400,我们的增量(400 + 1),它和我们更新表也是这个关键。所以我们现在是401。 我们用于此目的的sql是: SQL1: 我的问题是,是否需要锁定表,以便如果多个用户同时调用此键,则键可

  • 当使用事务处理时,需要创建 Session 对象。在进行事务处理时,可以混用 ORM 方法和 RAW 方法,如下代码所示: func MyTransactionOps() error { session := engine.NewSession() defer session.Close() // add Begin() before any action

  • 启动事务 $this->db->start(); Swoole::$php->db('slave2')->start(); 提交事务 $this->db->commit(); Swoole::$php->db('slave2')->commit(); 回滚事务 $this->db->rollback(); Swoole::$php->db('slave2')->rollback();

  • 在2.0.0之后我们已经支持事务嵌套了,是通过事务等级去实现的。 1. 开始事务 $model->beginTransaction(); 2. 事务提交 $model->commit(); 3. 事务回滚 $model->rollback();

  • 事务处理(transaction processing) 可以用来维护数据的完整性,保证SQL的操作要么完全执行,要么完全不执行,如果发生错误就进行撤销。 保证数据的完整性。 保证数据不受外影响。 事务处理的几道术语 事务(transaction) 一组SQL语句 退回(rollback)撤销执行SQL语句的过程 提交(commit) 将为执行的SQL语句写入数据库表 保留点(savepoint)