【问题标题】:firestore - react native - passing transaction as a parameter to a functionfirestore - 反应原生 - 将事务作为参数传递给函数
【发布时间】:2019-05-06 14:28:59
【问题描述】:

我正在尝试从内部传递交易

db.runTransaction((transaction)=>{...

块到导出到外部 .ts 文件(比如 functions.ts)中的函数。目的是使这个外部函数成为在我的其他 .js 文件之一中启动的事务计算的一部分,比如说 MyScreen.js。

因此,在事务之前,导出的函数如下所示:

static async updateDoc(ref) {
        return await ref.update("field", firebase.firestore.FieldValue.increment(1));
}

交易通过后是这样的:

static async updateDoc(ref,transaction) {
       return await transaction.update(ref,"field", firebase.firestore.FieldValue.increment(1));
}

我会在 MyScreen.js 文件中导入这个 functions.ts,然后像这样调用函数:

Functions.updateDoc(my_ref,transaction);

我已经进行了此更改,并且代码似乎可以正常工作。但是我怎么能确定这个外部函数现在实际上是原始事务的一部分呢?它的工作是否足以确保它现在实际上是该交易的一部分?有没有办法检查这个?

【问题讨论】:

  • part of the transaction 是什么意思?除非您在 catch 块中手动执行此操作,否则它不会自动回滚
  • 我的意思是,如果我将事务作为参数传递给的外部函数中发生错误,它们以及在此上下文中执行的原始文档 MyScreen.js 中的函数相同的事务全部回滚,反之亦然?他们现在是否都在同一个事务的上下文中。
  • 您在这里误解了事务参数。它只是数据库事务 api,它与任何其他上下文无关。如果您需要回滚数据库事务,您应该手动调用回滚方法,如果这样做,它不会回滚代码所做的任何其他更改,而是数据库更改。
  • 感谢您的回复,但我认为您在这里误解了我的问题。当然,我说的是数据库更改...无论如何...谢谢您的回复..
  • 正如我所说,您应该尝试{ await,, await, await} catch(transaction.rollback) 并将事务参数移至外部范围。

标签: react-native google-cloud-firestore


【解决方案1】:

只要您的外部函数调用位于 相同的 db.runTransaction 内,并且传递了 transaction 参数(并且仍在同一 db.runTransaction 块内),它们就是 >交易的一部分 -- 除非你没有在区块中使用transaction.get()transaction.update() 等。

为了测试,故意编错代码或者在某处抛出错误,让db.runTransaction的块触发.catch(),看看事务是否已经自动回滚。

希望这能回答你的问题。

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多