Код store
export interface TrackDomain {
id: number,
domain: string
}
export interface Tracklink {
id: number,
site: string,
site_id: number,
source_name: string,
source_alias: string,
source_id: number,
link: string,
created_at: string
}
export interface TrackingStore {
tracklinks: Tracklink[]
trackDomains: TrackDomain[]
isTracklinksFetching: boolean
isTrackDomainsFetching: boolean
start: () => void
getTrackDomains: () => Promise<TrackDomain[] | undefined>
}
export const useTrackingStore = create<TrackingStore>()(
devtools(
(set: (state: State<TrackingStore>) => void) => ({
tracklinks: [],
trackDomains: [],
isTrackDomainsFetching: false,
start: () => {
set({isTrackDomainsFetching: true})
},
getTrackDomains: async () : Promise<TrackDomain[] | undefined> => {
const { token } = useAuthStore.getState();
set({ isTrackDomainsFetching: true });
try {
const { data } = await axios.get<TrackDomain[] | undefined>(`${apiUrl}/settings/track-domains`, {
timeout: 900000000,
headers: {
Authorization: `Bearer ${token}`,
},
})
console.log(data); // <<<<<< здесь данные есть
set({ trackDomains: data });
return data;
} catch (e) {
console.log(e)
} finally {
set({ isTrackDomainsFetching: false })
}
return [];
},
})
))
В компоненте я хочу установть в селект перый полученный track домен.
useEffect(() => {
const fetchData = async () => {
trackingStore.start();
if (trackingStore.trackDomains.length === 0) {
const data = await trackingStore.getTrackDomains();
console.log(data, trackingStore.trackDomains)
if (trackingStore && trackingStore.trackDomains.length > 0) {
setTracker(trackingStore.trackDomains[0].domain + '/');
setValue('trackDomain_id', JSON.stringify(trackingStore.trackDomains[0]));
}
}
}
if (trackingStore.trackDomains.length === 0) {
fetchData();
}
}, []);
В функции getTrackDomains данные печатаются в консоль, а в useEffect - печатает
data = данные, trackingStore.trackDomains = []
Почему так? Я предположил, что set асинхронный, и поставил там await, но это не помогло.