Generic dataloader for redux-thunk using axios
This is one of the problems with async actions in redux-thunk. As you point out you have to create constants for "APARTMENT_FETCH_STATUS" and manually dispatch actions of this type before and after the request has been done. 

The redux-promise-middleware library actually does all this for you. You simply create an action like so:

const foo = () =&gt; ({
  type: 'FOO',
  payload: new Promise()
});


and the library will take care of dispatching an action of type "FOO_PENDING", and then of type "FOO_FULFILLED" when the promise has resolved. With redux-promise-middleware your actions would become something like this:

const showResultOfApartment = () =&gt; ({
    type: "FETCH_APARTMENT",
    payload: axios.get("http://api.com/apartments").then(result =&gt; result.data)
})


In your reducer you would create handlers for "FETCH_APARTMENT_PENDING", "FETCH_APARTMENT_FULFILLED" and "FETCH_APARTMENT_REJECTED". In the case where the promise fulfills or rejects, you also get the result of the promise by accessing action.payload. An example of what it could look like:

function apartmentReducer(state, action){
    if(action.type === "FETCH_APARTMENT_PENDING"){
        return Object.assign({}, state, { loading: true })
    }
    else if(action.type === "FETCH_APARTMENT_FULFILLED"){
        return Object.assign({}, state, { loading: false, apartment: action.payload })
    }
    else if(action.type === "FETCH_APARTMENT_REJECTED"){
        return Object.assign({}, state, { loading: false, error: action.payload })
    }
    return state;
}


redux-promise-middleware

Introduction to redux-promise-middleware