提问者:小点点

JavaFirebase管理SDK-数据库参考-setValue与setValueAsync


使用Java-Firebase AdminSDK。

我必须在Firebase实时数据库上进行两次更新。必须发生更新#1,然后才应该发生更新#2。

我之前用过这个:

ref.setValueAsync("update#1");
ref.setValueAsync("update#2");

但在极少数情况下——更新#2发生在更新#1之前——我们的使用流程中断了;我将代码重构为这样:

ref.setValue("update#1", null);
ref.setValueAsync("update#2");

此更改是在假设setValue是同步调用的情况下进行的,并且我们只会在更新#1完成后进行更新#2。但是我们注意到更新#1之前发生的更新#2的情况仍然存在-尽管非常罕见。


共1个答案

匿名用户

但在极少数情况下——更新#2发生在更新#1之前

这是预期的行为,因为操作是并行运行的。因此,在某些情况下,第二个操作比第一个操作完成得更快。因此,简单地在另一个操作之后调用一个操作并不能保证操作完成的顺序。

如果您需要执行第二个操作,只有当您100%确定第一个操作已完成时,您才必须将实际数据和完成侦听器传递给setValue()方法:

ref.setValue("data", new DatabaseReference.CompletionListener() {
  @Override
  public void onComplete(DatabaseError error, DatabaseReference dataRef) {
    if (error != null) {
      System.out.println("Failed because of " + error.getMessage());
    } else {
      //Perform the second operation.
    }
  }
})

因此,一旦第一个操作完成,回调内部就会执行第二个操作。