B
Size: a a a
B
DB
.simulate('click')
. А если ты где-то делаешь setTimeout(() => setState(), 1000)
B
.simulate('click')
. А если ты где-то делаешь setTimeout(() => setState(), 1000)
DB
DB
[
{
name: 'myComponent'
}
]
nst componentsMap = {И там где рендеришь делаешь
myComponent: MyComponent
}
MK
[
{
name: 'myComponent'
}
]
nst componentsMap = {И там где рендеришь делаешь
myComponent: MyComponent
}
V
VO
LK
export function async<T, P>(
type: T,
action: (...args: any[]) => Promise<P>,
...args: any
) {
return async (dispatch: any) => {
function startedAsyncAction() {
dispatch({
type: `${type}_${AsyncActionStatus.STARTED}`,
status: AsyncActionStatus.STARTED,
});
}
function succeededAsyncAction(payload: any) {
dispatch({
type: `${type}_${AsyncActionStatus.SUCCEEDED}`,
status: AsyncActionStatus.SUCCEEDED,
payload,
});
return payload;
}
function failedAsyncAction(payload: any) {
dispatch({
type: `${type}_${AsyncActionStatus.FAILED}`,
status: AsyncActionStatus.FAILED,
payload,
});
return payload;
}
startedAsyncAction();
try {
const payload = await action(...args);
return succeededAsyncAction(payload);
} catch (error) {
return failedAsyncAction(error);
}
};
}
LK
LK
LK
function* asyncSaga(user) {
while (true) {
try {
yield put({ type: "USER_FETCH_SUCCEEDED", user: user });
} catch (e) {
yield put({ type: "USER_FETCH_FAILED", message: e.message });
}
}
}
function* root() {
yield takeLatest("USER_FETCH_REQUESTED", asyncSaga);
}
LK
LK
KB
useRedux
и fetch
, который к примеру буду вызывать в useEffect какого-то компонента.KB
export const useGiphyService = limit => {
const [state, dispatch] = useReducer(gifsReducer, initialState);
const fetch = useCallback(
async (query, offset = 0, isIncremental = false) => {
if (!query) {
return dispatch({
type: FETCH_NEW_GIFS_SUCCESS,
data: [],
isLastPage: true
});
}
dispatch({
type: isIncremental ? FETCH_MORE_GIFS_REQUEST : FETCH_NEW_GIFS_REQUEST
});
try {
const {
data,
pagination: { total_count, offset: newOffset, count }
} = await searchGifs({ query, limit, offset });
const isLastPage = total_count - newOffset <= count;
dispatch({
type: isIncremental
? FETCH_MORE_GIFS_SUCCESS
: FETCH_NEW_GIFS_SUCCESS,
data,
isLastPage
});
} catch {
dispatch({
type: isIncremental ? FETCH_MORE_GIFS_FAILURE : FETCH_NEW_GIFS_FAILURE
});
}
},
[limit]
);
return { state, fetch };
};
KB
TS
export const useGiphyService = limit => {
const [state, dispatch] = useReducer(gifsReducer, initialState);
const fetch = useCallback(
async (query, offset = 0, isIncremental = false) => {
if (!query) {
return dispatch({
type: FETCH_NEW_GIFS_SUCCESS,
data: [],
isLastPage: true
});
}
dispatch({
type: isIncremental ? FETCH_MORE_GIFS_REQUEST : FETCH_NEW_GIFS_REQUEST
});
try {
const {
data,
pagination: { total_count, offset: newOffset, count }
} = await searchGifs({ query, limit, offset });
const isLastPage = total_count - newOffset <= count;
dispatch({
type: isIncremental
? FETCH_MORE_GIFS_SUCCESS
: FETCH_NEW_GIFS_SUCCESS,
data,
isLastPage
});
} catch {
dispatch({
type: isIncremental ? FETCH_MORE_GIFS_FAILURE : FETCH_NEW_GIFS_FAILURE
});
}
},
[limit]
);
return { state, fetch };
};
KB