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

Firebase-Android-FetchProvidersForeMail-为什么所有的调用都是异步的?

公孙成仁
2023-03-14

我是Firebase的新手,我有很多问题,因为所有的任务都是异步调用的。

public static void printProviders(String email) {
    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.fetchProvidersForEmail(email).addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>() {
            @Override
            public void onComplete(@NonNull Task<ProviderQueryResult> task) {
                Log.d(TAG, "We have " + task.getResult().getProviders().size() + " results.");
                for (int i = 0; i < task.getResult().getProviders().size(); i++) {
                    Log.d(TAG, "Provider " + (i+1) + ": " + task.getResult().getProviders().get(i));
                }
            }
        }
    );
}
    public static boolean emailIsRegistered(String email) {
    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.fetchProvidersForEmail(email).addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>() {
         @Override
         public void onComplete(@NonNull Task<ProviderQueryResult> task) {
             if (task.getResult().getProviders().size() > 0) {
                 return true;
             }
             return false;
         }
    });
}

谢谢!

共有1个答案

萧德庸
2023-03-14

当您调用FetchProvidersForeMail时,该信息在应用程序的APK中不可用。Firebase客户机必须呼叫服务器才能获得此信息。

考虑到internet的性质,这意味着在从这些服务器返回结果之前,将需要一段未知的时间。

在此期间,客户端有几个选择:

    null
if (emailIsRegistered(email)) {
    signInUser(email);
}
else {
    signUpUser(email);
}
public static boolean emailIsRegistered(String email) {
FirebaseAuth auth = FirebaseAuth.getInstance();
auth.fetchProvidersForEmail(email).addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>() {
     @Override
     public void onComplete(@NonNull Task<ProviderQueryResult> task) {
         if (task.getResult().getProviders().size() > 0) {
             signUserIn(email);
         }
         signUserUp(email);
     }
});

学习处理异步调用既困难又重要。我不确定这是否是我对概念的最好解释。所以我将包括一些之前的解释(来自我和其他人):

  • 在Firebase侦听器中设置单例属性值
  • Firebase Android:如何依次阅读不同的引用
  • 是否可以从Firebase同步加载数据?
  • 知道Firebase何时完成API调用?
  • 从Firebase异步收集数据:数据集何时完成?
  • 在Android中什么是回调?
 类似资料:
  • 问题内容: 我很好奇所有的JavaScript回调是异步的,还是仅在某些情况下才是异步的。另外,我确定是什么使浏览器和Node.js的javascript代码异步(或使用异步javascript的方式)有所不同,所以我想知道在每种情况下什么才是真正的异步javascript。 我的印象是,在以下情况下,我实际上并没有编写异步代码。 但是,例如,我知道jQuery的AJAX函数是真正异步的(没有考虑

  • 然而,在我下面的代码中,我希望在这两个示例中都花费相同的15秒(每个任务5秒),如本文所述。然而,第二个示例只需要5秒,同时运行所有3个示例也需要5秒来完成第二个示例。原来的文章花了5秒,但我把它改成了1秒的延迟,让它更明显。 有没有人能解释一下这是怎么回事,为什么它看起来像线程一样运行?

  • 问题 import a from 'module-a'; import b from 'module-b'; console.log(a); console.log(b); 这几行代码是同步执行的,为什么却说 ESM 是异步的。 谁说ESM是异步的? https://nodejs.org/api/packages.html 这里说的 其他问题 看到几篇文章,大都是说 script标签的加载是异步的

  • 我刚刚发现,在react函数都是异步的,或者在调用它的函数完成后调用。 现在这两样东西很难消化 在博客中,函数是在函数内部调用的,但是触发函数的原因并不是被调用函数所知道的。 他们为什么要让异步,因为JS是单线程语言,而且这个setState不是WebAPI或服务器调用,所以只能在JS的线程上完成。他们这样做是为了使重新呈现不会停止所有事件侦听器和其他东西,还是有其他设计问题。

  • 官方: http://developer.android.com/reference/android/os/asynctask.html onProgressUpdate(Progress...),在调用publishProgress(Progress...)后在UI线程上调用.执行的时间未定义。此方法用于在后台计算仍在执行时,在用户界面中显示任何形式的进度。例如,它可以用于动画进度条或在文本字段

  • 我有java背景,对Lambda所需的Javascript约定有点陌生。 我有一个lambda函数,它可以按照特定的顺序执行几个AWS任务,具体取决于前一个任务的结果。 考虑到每个任务都异步报告其结果,我想知道是否正确的方法可以确保它们都按正确的顺序发生,并且一个操作的结果可供下一个函数调用。 似乎我必须在前一个函数的回调中包含每个函数,但似乎这将进行某种深度嵌套,并想知道这是否是正确的方法。 例