在我点击屏幕上的任意位置之前,Firebase 登录承诺不会解决
Posted
技术标签:
【中文标题】在我点击屏幕上的任意位置之前,Firebase 登录承诺不会解决【英文标题】:Firebase login promise doesn't resolve until I tap anywhere on the screen 【发布时间】:2019-09-08 15:04:40 【问题描述】:我正在关注这个React course on Udemy,但遇到了一个非常奇怪的错误。
我正在使用 Firebase 通过电子邮件和密码进行身份验证。当用户点击登录时,我会发送一个名为 LOGIN_USER 的操作,它会设置加载状态。
登录成功后,我调度一个名为LOGIN_USER_SUCCESS
的操作来停止加载状态。
由于某种原因,LOGIN_USER_SUCCESS
不会发生,直到我随机点击屏幕上的某个位置。
如果我删除 dispatch( type: LOGIN_USER );
行以禁用加载状态,登录会在几秒钟后返回成功。
My actions
-----------
export const loginUser = ( email, password ) =>
return (dispatch) =>
dispatch( type: LOGIN_USER );
firebase.auth().signInWithEmailAndPassword(email, password)
.then(user => loginUserSuccess(dispatch, user))
.catch((error) =>
console.log(error);
firebase.auth().createUserWithEmailAndPassword(email, password)
.then(user => loginUserSuccess(dispatch, user))
.catch(() => loginUserFail(dispatch));
);
;
;
const loginUserSuccess = (dispatch, user) =>
dispatch(
type: LOGIN_USER_SUCCESS,
payload: user
);
;
const INITIAL_STATE =
email: '',
password: '',
user: null,
error: '',
loading: false
;
/// My reducer
---------------
export default (state = INITIAL_STATE, action) =>
switch (action.type)
case EMAIL_CHANGED:
return ...state, email: action.payload ;
case PASSWORD_CHANGED:
return ...state, password: action.payload ;
case LOGIN_USER:
return ...state, loading: true, error: '' ;
case LOGIN_USER_SUCCESS:
return ...state, ...INITIAL_STATE, user: action.payload ;
case LOGIN_USER_FAIL:
return ...state, error: 'Authentication Failed.', password: '', loading: false ;
default:
return state;
;
我尝试了.then(user => console.log(user))
,直到我随机点击屏幕上的任意位置后才看到控制台日志。
如果我这样做 .then(console.log('foo')
我会立即看到 foo,但屏幕仍然挂起。
正如我所提到的,我正在学习一个教程,完整的源代码是 here on GitHub。我基本上得到了完全相同的代码。
【问题讨论】:
我也在关注他的一门 Udemy 课程,但遇到了同样的问题。你找到解决办法了吗? 我只是忽略了这个问题,因为它似乎是一个模拟器问题。也就是说,使用更新版本的 Xcode,我在 Xcode 中构建了我的项目(而不是命令行中的 react-native run-ios),它打开了另一个没有这个问题的模拟器。 【参考方案1】:我有同样的问题。似乎某些 firebase 功能在模拟器或模拟器中无法正常工作。我尝试在 iphone 设备上运行我的应用程序,它工作得很好。
【讨论】:
【参考方案2】:在 firebase 中登录用户的推荐方法是注册一个回调到 firebase.auth().onAuthStateChanged(call_back)
。您可以从此回调中调度您的操作
【讨论】:
以上是关于在我点击屏幕上的任意位置之前,Firebase 登录承诺不会解决的主要内容,如果未能解决你的问题,请参考以下文章