使用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的情况仍然存在-尽管非常罕见。
但在极少数情况下——更新#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.
}
}
})
因此,一旦第一个操作完成,回调内部就会执行第二个操作。