http.js
import axios from 'axios';
import { Observable } from 'rxjs';
import { BaseURL } from './constant';
const instance = axios.create({
baseURL: BaseURL,
withCredentials: true,
});
instance.interceptors.response.use(
(response) => response,
(error) => {
const { status, message = '' } = error.response.data;
return Promise.reject(new Error(`${status} : ${message}`));
},
);
function Api(config = {}, interval) {
const intervalType = typeof interval;
const fetchDataInterval =
intervalType === 'number'
? interval
: intervalType === false
? 0
: 60 * 1000;
const observable = Observable.create((observer) => {
let timer;
function fetchData() {
const { data = {}, method = 'get', url } = config;
const opt = {
url,
method,
};
method === 'get' ? (opt.params = data) : (opt.data = data);
instance
.request(opt)
.then((res) => {
observer.next(res.data);
})
.catch((error) => {
throw error;
})
.then(() => {
if (fetchDataInterval) {
timer = setTimeout(fetchData, fetchDataInterval);
}
});
}
fetchData();
return () => {
observer.complete();
timer && clearTimeout(timer);
};
});
observable.then = observable.subscribe;
return observable;
}
export default Api;