React Redux如何使用getState()

时间:2020-09-15 08:58:49

标签: javascript reactjs redux react-redux redux-thunk

我正在从Firebase Real-time database获取数据并将其存储到我的redux状态。我该如何创建一个动作,在首次通话后将获得最新的状态?

const getIds = (state) => state.notes.activeNotes;

export const getUserNotes = (currentUserId) => (dispatch, getState) => {
  getFromFirebase(`/Notes/${currentUserId}/`, (response) => {
    var ids = Object.keys(response)
      dispatch(setNoteIds(ids)); //should dispatch ids something like this [1,2,3,4,5]
  })

  const test= getIds(getState());
  console.log(test); //current output []
}

Expected output: [1,2,3,4,5]
Actual output: []

1 个答案:

答案 0 :(得分:0)

假设函数getFromFirebase返回一个Promise,则可以按如下所示将方法切换为异步方法:


export const getUserNotes = (currentUserId) => async (dispatch, getState) => {
  // wait the result dispatched
  await getFromFirebase(`/Notes/${currentUserId}/`, (response) => {
    var ids = Object.keys(response)
      dispatch(setNoteIds(ids)); //should dispatch ids something like this [1,2,3,4,5]
  })
  
  const test= getIds(getState());
}

或者如果getFromFirebase不是一个承诺,则可以通过一个承诺将其包裹起来:

export const getUserNotes = (currentUserId) => async (dispatch, getState) => {
  // wrap in a promise
  await new Promise(resolve => {
    getFromFirebase(`/Notes/${currentUserId}/`, (response) => {
      var ids = Object.keys(response)
        dispatch(setNoteIds(ids)); //should dispatch ids something like this [1,2,3,4,5]
        resolve();
    })
  })
  
  const test= getIds(getState())
}