如何删除 Google OAuth2gapi 事件侦听器?

2024-01-09

我真的很难理解如何删除谷歌gapi事件监听器。下面粗体是所讨论的完整功能。

window.gapi.auth2.getAuthInstance().isSignedIn.listen(onAuthChange);

我想在 useEffect 挂钩中使用清理函数来删除事件侦听器,但执行此操作的实际代码...我认为与简单的 javascript“removeEventListener”不同?我在谷歌文档中找不到任何内容。我的问题是我需要知道其他页面上的身份验证状态何时发生变化,并且需要其他函数在事件触发时运行(身份验证状态更改) - 但由于原始版本不断运行,我最终得到了一堆不必要的函数调用。当您登录和退出时,情况会变得更糟......随着事件侦听器的累积。


import React, { useEffect, useContext, useState } from "react";
import history from "../history";
import { GeneralContext } from "../contexts/General";

const GoogleAuth = () => {
  const { state, setState } = useContext(GeneralContext);

  const onAuthChange = () => {
    const auth = window.gapi.auth2.getAuthInstance();
    setState({ authStatus: auth.isSignedIn.get() });

    if (auth.isSignedIn.get() === true) {
      const token = auth.currentUser.fe.qc.access_token;
      setState({ accessToken: token });
    }
  };

  // Check auth status on mount
  useEffect(() => {
    window.gapi.load("client:auth2", () => {
      window.gapi.client
        .init({
          clientId:
            "320808104510-qjdjiooodidc8jm1i000oteqc7h63029.apps.googleusercontent.com",
          scope: "https://www.googleapis.com/auth/books",
        })
        .then(() => {
          const auth = window.gapi.auth2.getAuthInstance();
          //setState({ authStatus: auth.isSignedIn.get() });
          console.log("Event listender mounted on Sign-in Page");
          auth.isSignedIn.listen(onAuthChange);
        });
    });
  }, []);

  const onClick = () => {
    console.log(state.authStatus);
    const auth = window.gapi.auth2.getAuthInstance();
    auth.signIn();
    //setState({ authStatus: auth.isSignedIn.get() });
  };

  // Proceed to next page if user Signs into Google
  const proceed = () => {
    //Verify sign in
    if (state.authStatus === true) {
      //console.log("I am signed in");
      history.push("/home");
    }
  };

  // Runs after state updates
  useEffect(() => {
    proceed();

    return () => {
      // console.log("GoogleAuth Unmounted");
      // const auth = window.gapi.auth2.getAuthInstance();
      // window.removeEventListener(onAuthChange(), auth.isSignedIn.listen()); <--This is my attempt to remove the event listender, but it didn't work! 
    };
  }, [state.authStatus]);

  return (
    <React.Fragment>
      <div to="/" className="login btn" onClick={onClick}>
        Sign in with Google
        <svg className="google__svg">
          <use xlinkHref="img/sprite.svg#icon-google"></use>
        </svg>
      </div>
    </React.Fragment>
  );
};

export default GoogleAuth;


我遇到了同样的问题,并且找不到任何文档来指导我正确的方向。虽然我找到的文档和打字稿都表明auth.isSignedIn.listen()没有返回值,检查浏览器控制台中的返回值发现情况并非如此。

它返回一个对象,该对象有一个remove()其原型上的方法。添加监听器时保存返回的对象,并调用它的remove清理中的方法。

  useEffect(
      () => {
        let listenerContext;

        window.gapi.load('client:auth2', () => {
          window.gapi.client.init({
            clientId,
            discoveryDocs: [...DISCOVERY_DOCS],
            scope: SCOPES,
          }).then(() => {
            const auth = window.gapi.auth2.getAuthInstance();
            listenerContext = auth.isSignedIn.listen(onSigninChange);
            // ... etc
          });
        });

        return () => {
          listenerContext?.remove();
        };
      },
      [],
  );

因为我找不到任何文档,所以我不能声称这是一个稳定的长期功能。至少,我希望它能帮助你在你的项目中畅通无阻。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除 Google OAuth2gapi 事件侦听器? 的相关文章

随机推荐

  • 无法在 Wear OS Samsung Galaxy Watch 4 上请求蓝牙权限

    我创建了一个示例 Wear OS 应用程序 它应该发现 BLE 设备 但我的代码需要蓝牙权限 当我将这些行放入清单中时
  • 角度 2 中的条件图像 Src 绑定

    三元条件如何写 img src在角度 2 中 下面是我尝试过的代码 但这不起作用 img class lib img height 500 width 500 alt default image src item pictureUrl nu
  • Nsdateformatter 以所选手机的语言返回日期。它可以一直只返回英文吗?

    我正在使用 dateformatter 来获取应用程序中的日期和时间 但是 当我更改手机日期格式器的语言时 我遇到了一个问题 它返回了手机所选语言的日期和时间 由于我们不支持多种语言 因此我的应用程序崩溃了 请找到下面的代码片段 NSDat
  • Android LocationManager 网络提供商返回 null

    我想使用 Android 应用程序获取我的 GPS 坐标 我开始开发 我可以获取GPS坐标 但它们不准确 我想使用 NETWORK PROVIDER 但该提供程序的位置始终为空 更有趣的是 isProvicerEnabled 返回 true
  • 通过 url 参数根据区域设置在 nginx 上设置自定义 404 错误页面

    我正在运行最新的稳定版本Nginx on GNU Linux操作系统并拥有以下虚拟主机 我正在尝试setup custom localized 404 error pages avoiding if但我总是陷入重定向循环 到目前为止 我只考
  • 对齐 html 电子邮件中表格中的数据单元格元素

    我有一个如下所示的屏幕截图 我必须在 HTML CSS 中复制它 附件是fiddle https jsfiddle net dehg79qs embedded result我现在可以复制它 我正在编写 HTML 电子邮件代码 因此这就是我在
  • 等待 asyncio.Future 会引发并发.futures._base.CancelledError,而不是等待设置值/异常

    当我运行以下 python 代码时 import asyncio import logging logging basicConfig level logging DEBUG async def read future fut print
  • 使用bundle exec运行rails控制台

    当我执行时bundle exec rails c我得到一个带有以下提示的 ruby 控制台 Loading development environment Rails 3 0 3 jruby 1 6 3 001 gt 一切看起来都按顺序进行
  • 将 console.log 转换为输出到 div

    我正在使用本主题中的简单 rss feed 解析器示例 Rss 解析器示例 https stackoverflow com questions 10943544 how to parse an rss feed using javascri
  • 应用程序关闭时发送通知

    当应用程序完全关闭时 如何以编程方式发送通知 示例 用户关闭了应用程序 也在 Android 任务管理器中 然后等待 应用程序应在 X 秒后或当应用程序检查更新时发送通知 我尝试使用这些代码示例 但是 应用程序关闭时推送通知 https s
  • sbt-assemble:跳过特定测试

    我想配置sbt assembly跳过特定的测试课程 有什么办法可以做到这一点吗 如果有帮助 我使用 ScalaTest 标记了测试 Network tag See 具有共享源的附加测试配置 http www scala sbt org 0
  • 0 在socket()系统调用中表示什么?

    下一行中的 0 表示什么 我还可以使用哪些其他标志 server socket AF UNIX SOCK STREAM 0 正如其他人可能所说的那样 第三个论点socket一般是一个int指示协议 0表示调用者不想指定协议并将其留给服务提供
  • 在 OSX 10.8 SDK/objective-c 中拖动按钮

    我开始使用 Objective Ctoday为了开发 OSX 山狮 的应用程序 我有一堆按钮 我想将它们拖到其他对象中 例如文本字段 我按照苹果开发网站上的教程进行操作 但我无法让拖动部分工作 放置部分工作 例如 我可以将文件从查找器拖到文
  • 低 RAM 消耗 C++ 特征求解器

    我是新手C 编程 但我有一个任务来计算特征值和特征向量 标准特征问题Ax lx 对于对称矩阵 和厄米矩阵 对于尺寸非常大的矩阵 二项式 L L 2 where L大约是18 22 现在我正在具有大约 7 7 GB 可用内存的机器上进行测试
  • 为什么我的重载 C++ 构造函数没有被调用?

    我有一堂这样的课 class Test public Test string value Test bool value 如果我创建一个像这样的对象 Test test Just a test bool 构造函数被调用 有人知道为什么吗 T
  • PHP使用session来选择下拉选项

    我已经获得了此上传表单 并且希望保留会话中下拉列表中的所选选项 以便在提交后显示最后的选择 例如我选择 颜色 选项 提交后颜色仍然在下拉列表中选择 我回显 SESSION testname 就在第一个单选按钮之前 它给我返回 颜色 但在选项
  • JQuery 中的简单 SQL 查询生成器

    我正在尝试找到一个类似于 SQL 查询生成器插件的简单查询生成器界面http plugins jquery com project SQL QUERY BUILDER http plugins jquery com project SQL
  • 是否可以乐观地更新端点的所有缓存?

    在 redux 教程中 我们学习了如何执行乐观更新 第 8 部分 rtk query advanced implementing optimistic updates https redux js org tutorials essenti
  • 将 4 字节消息头从 C# 客户端发送到 Java 服务器

    我正在尝试为用 Java 编写的服务器编写一个 C 客户端 服务器需要一个 4 字节 Java 中的 DataInputStread readInt 消息头 后跟实际消息 我对 C 完全陌生 如何将此消息头发送到 Java 服务器 我尝试了
  • 如何删除 Google OAuth2gapi 事件侦听器?

    我真的很难理解如何删除谷歌gapi事件监听器 下面粗体是所讨论的完整功能 window gapi auth2 getAuthInstance isSignedIn listen onAuthChange 我想在 useEffect 挂钩中使