Похоже, ваша getPrivateKey
функция - это гром, но вы не отправляете так? И ничто не мешает вам возвращать значения из thunks.
const getPrivateKey = async (dispatch) => {
const privKey = await fetchKeyFromServer();
dispatch({
type: 'UPDATE',
value: privKey
});
return privKey // return the key here to whoever wants to use the value immediately.
};
Тогда в вашем useEffect
в компоненте вы можете легко использовать возвращаемое значение:)
useEffect(() => {
const configure = async () => {
//make sure you 'dispatch' this thunk
const key = await dispatch(getPrivateKey());
// pass the key
await dispatch(connectWithKey(key));
...
};
....
}, []);
Код Выше предполагается, что connectWithKey
также является громоотводом. Если это так, вы можете спроектировать thunk таким образом, чтобы он либо использовал переданное значение, либо считывал его из хранилища с избыточностью.
const connectWithkey = (privateKey: passedPrivateKey) = async (dispatch, getState) => {
const state = getState();
let privateKey = state.whatever.the.path.is.to.privateKey;
// use the passed private key if it is present.
if (passedPrivateKey) {
privateKey = passedPrivateKey;
}
await connectToServer(privateKey)
};
Я использовал этот подход несколько раз в своем приложении. Таким образом, вам не нужно полагаться на состояние в селекторе. И если вы решите положиться на это состояние, зависимости вашего useEffect
должны соответственно обновиться. Прямо сейчас это пустой массив, и поэтому эффект не запускается снова при любых изменениях состояния (он действует как функция жизненного цикла componentDidMount
).
const privateKey = useSelector(({ main }) => main.privateKey);
useEffect(() => {
await getPrivateKey();
if (privateKey) {
await connectWithKey();
}
}, [privateKey]);
Таким образом, ваш хук перехватывается. - запускается каждый раз при изменении состояния privateKey
. Возможно, вам понадобится какое-то условие для вашего connectWithKey
thunk, чтобы оно не запускалось, если ключ нулевой.