Meteor如何在调度Redux操作之前等待回调

时间:2016-05-25 22:59:30

标签: javascript meteor redux

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 FuturesPromises,但我找不到任何可能更好或更好的内容。

我认为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。整个想法是以用户当前所处的形式显示错误(在此示例中为登录表单)

1 个答案:

答案 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()

连接起来