Meteor使用回调,但似乎没有“等待”#39;对于他们与Redux行动。因此,如果使用类似Redux之类的内容并执行类似的操作:
export function loginWithPassword(email, password) {
return dispatch => {
Meteor.loginWithPassword(email, password, error => {
if (error) {
return dispatch({type: ASYNC_ERROR, data: error.reason})
});
}
}
...操作将在Meteor的调用之前完成并返回(因此如果需要,不会重新呈现UI)。我已经洗了好几个小时试图找到解决这个问题的最佳方法无济于事。基于我能够找到的内容,似乎选项是Meteor Futures或Promises,但我找不到任何可能更好或更好的内容。
我认为Futures只能是服务器端并且使用的次数不如Promises,所以Promise可能是基于此的更好的选择。我甚至不确定Futures是否是一种选择,因为行动是客户方面的。但是我也不确定Meteor是否能与Promises一起玩得很好,因为它具有一般的同步特性。
承诺我认为可以是客户端或服务器。假设他们是客户端,将它们放在动作或UI代码中调度动作会更好 - 或者它真的重要吗?
有没有人对如何最好地处理这样的事情有任何想法或见解?一个或另一个(或两者)的工作示例将是伟大的,因为我肯定无法找到一个小时的搜索。具体来说,很高兴看到一个简单的Meteor登录示例,其中包含通过Redux调度的密码,该密码显示“未找到用户”#34;或其他一些异步' UI登录表单中的错误(第一次)。
上面的操作实际上有效,但它在Meteor完成之前返回错误,因此初始时间内UI中不会显示错误。
TIA!
P.S。有几个示例在警报窗口或console.log中显示错误 - 但这与在调度操作的UI中更新/显示它作为prop不同。没有与警报或console.log绑定的prop re-renders。整个想法是以用户当前所处的形式显示错误(在此示例中为登录表单)
答案 0 :(得分:0)
使用redux-thunk,你可以写下面的内容。我认为这里的技巧是知道用户对象登录后的状态。一种方法是在store.dispatch
内使用Tracker.autorun
:
// whenever the reactive data changes, we will dispatch the appropriate action
Tracker.autorun(() => {
if (Meteor.loggingIn()) {
return store.dispatch({
type: LOGGING_IN,
});
}
const user = Meteor.user();
store.dispatch({
type: SET_USER,
user,
}
});
export const login = ({ email, password }) => (dispatch) => {
Meteor.loginWithPassword(email, password, (error) => {
if (error) {
return dispatch({
type: LOGIN_ERROR,
error,
});
}
return dispatch({
type: LOGIN_SUCCESS,
});
});
};
您可以想象一个用户缩减器,其状态为{user: {loggingIn: Boolean, authError: SomeErrorModel}}}
或类似
您可以清除authError
上的LOGGING_IN
,并将其添加到LOGIN_ERROR
对于基于此缩减器的任何UI更改,只需将您的反应组件与react-redux
connect()