【问题标题】:How to convert promise based?如何转换基于承诺?
【发布时间】:2021-01-27 18:02:01
【问题描述】:

我的应用程序最初是从本地存储加载数据,现在我正在尝试使用 firebase。 Firebase 总是倾向于返回一个承诺。所以我正在尝试将 store 转换为 firebase return one。

这是原版

export const loadState = () => {
  const state: AppState = getDefaultState();
  VALID_LABS.forEach(labId => {
    state.labs[labId] = getDefaultLabState();
    STORAGE_CONFIG.forEach(storageField => {
      const { statePath, storageKey, defaultValueFn } = storageField;
      const loadedValue = getFromLocalStorage(
        labId,
        storageKey,
        defaultValueFn()
      );
      cachedValues[`${labId}:${storageKey}`] = loadedValue;
      set(state, `labs.${labId}.${statePath}`, loadedValue);
    });
  });
  return state as AppState;
};

const store = createStore(rootReducer, loadState(), applyMiddleware(thunk));
store.subscribe(
  throttle(() => {
    saveState(store.getState());
  }, 500)
);

如您所见,我正在使流程正常工作。但是当我开始使用 firebase 时,问题就出现了。

我的 loadState 变成了这样。

export const loadState = (): AppState => {
  if (firebase.auth().currentUser.uid) {
    let userId = firebase.auth().currentUser.uid;
    return firebase
      .database()
      .ref('/users/' + userId)
      .once('value')
      .then(function(snapshot) {
        return snapshot.val() as AppState;
      }).catch((err) => {
        console.error(err)
      })
  }
};

所以我还需要将store 转换为接受从新loadState 返回的promise。 我不知道如何转换它,因为我也在使用applyMiddleWare(thunk)

let saveState: (state: AppState) => void
    ;
let loadState: () => AppState;
if(firebase.auth().currentUser){
  loadState = loadStateFirebase;
  saveState = saveStateFirebase;
}else{
  loadState = loadStateLocalStorage;
  saveState = saveStateLocalStorage;
}

// call loadstate then data,pass it in as second para to appstate store
const store = createStore(rootReducer, loadState(), applyMiddleware(thunk));
store.subscribe(
  throttle(() => {
    saveState(store.getState());
  }, 500)
);

谁能帮帮我

【问题讨论】:

  • 谁能告诉我你有一个减号

标签: reactjs typescript firebase


【解决方案1】:

添加泛型。

React.FC<P>

所以:

const EmailTarget: React.FC<{match: {params: {tokenId: string}}/*put correct type, I don't know it*/}> = ( props ) => {
    const [ loginState, setLoginState ] = useState('');

    useEffect(() => {
        axios.post('http://localhost:1337/verify', {id: props.match.params.tokenId}).then(res => {
          
        })
    }, [])

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2020-08-17
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多