+ api.dispatch<any>(async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ while (true) {
+ let de = getDataExplorer(getState().dataExplorer, service.getId());
+ switch (de.requestState) {
+ case DataTableRequestState.IDLE:
+ // Start a new request.
+ try {
+ dispatch(actions.SET_REQUEST_STATE({ requestState: DataTableRequestState.PENDING }));
+ await service.requestItems(api, criteriaChanged);
+ } catch {
+ dispatch(actions.SET_REQUEST_STATE({ requestState: DataTableRequestState.NEED_REFRESH }));
+ }
+ // Now check if the state is still PENDING, if it moved to NEED_REFRESH
+ // then we need to reissue requestItems
+ de = getDataExplorer(getState().dataExplorer, service.getId());
+ const complete = (de.requestState === DataTableRequestState.PENDING);
+ dispatch(actions.SET_REQUEST_STATE({ requestState: DataTableRequestState.IDLE }));
+ if (complete) {
+ return;
+ }
+ break;
+ case DataTableRequestState.PENDING:
+ // State is PENDING, move it to NEED_REFRESH so that when the current request finishes it starts a new one.
+ dispatch(actions.SET_REQUEST_STATE({ requestState: DataTableRequestState.NEED_REFRESH }));
+ return;
+ case DataTableRequestState.NEED_REFRESH:
+ // Nothing to do right now.
+ return;
+ }
+ }
+ });