【发布时间】:2017-11-21 19:55:21
【问题描述】:
我的 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="google-signin-client_id" content= "my_client_id.apps.googleusercontent.com">
<meta name="google-signin-scope" content="profile email">
<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
<script>
function start() {
console.log('script running')
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: 'my_client_id.apps.googleusercontent.com',
scope: 'profile email'
});
});
}
</script>
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
在start() 函数中,我打印到控制台以查看它何时运行。
当我加载页面时,start() 每隔一段时间就会加载 反应组件。
登录.js
componentDidMount() {
console.log(gapi.auth2.getAuthInstance())
}
在调试器中你可以看到脚本在组件之后加载:
如果我刷新页面几次,它工作正常。但有时有效,有时无效。
为什么?
【问题讨论】:
-
你问为什么? 但实际上,我认为没有为什么。这只是一个竞赛条件。有时代码块按一种顺序处理,有时另一种。你怎么打电话给
start(),你是怎么初始化反应组件的?它们是同步完成的吗? -
start() 在 HTML 文件中被调用
"https://apis.google.com/js/client:platform.js?onload=start" -
啊,是的,所以这是异步的。如果您从该标签中删除
async和defer,它会起作用吗?我想不是因为 google apis 强制异步加载的方式 -
即使它确实开始工作,就 console.log 而言,实际的 google API 可能仍会遭受相同的竞争条件。真的,您需要在
gapi.auth2.init()的回调中初始化反应组件,或者确保反应在尝试访问其任何信息之前调用它 -
可能想要混淆
client_id
标签: javascript html reactjs