jizy-api
Version:
A lightweight API transport library (fetch/xhr proxies)
78 lines (62 loc) • 2.32 kB
JavaScript
import jApi from './api.js';
export default class jAjax extends jApi {
async transport() {
if (this.data && this.method === 'GET') {
// append query
this.url = (url + '&' + this.data).replace(/[&?]{1,2}/, '?');
this.data = undefined;
}
let url = this.url;
let result = {};
const xhr = new XMLHttpRequest();
const timeoutId = setTimeout(() => {
xhr.abort();
result.exception = 'AJAX Request timeout';
}, this.timeout);
if (this.json === true) {
xhr.overrideMimeType('application/json');
}
xhr.open(this.method, url);
if (this.method === 'POST') {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
}
xhr.onload = () => {
clearTimeout(timeoutId);
if (xhr.status === 0) {
result.exception = 'AJAX Request aborted';
return;
}
result.status = xhr.status;
const responseText = xhr.responseText;
result.responseText = responseText;
if (xhr.status >= 200 && xhr.status < 400) {
if (this.method === 'POST' && responseText === '') {
}
else if (this.json === true) {
try {
const responseData = JSON.parse(responseText);
result = Object.assign(result, responseData);
} catch (e) {
result.exception = 'Invalid JSON';
}
}
} else {
result.exception = 'AJAX request failed';
}
};
xhr.onerror = () => {
clearTimeout(timeoutId);
result.exception = 'AJAX Request.onerror';
};
try {
xhr.send(this.data || null);
} catch (e) {
if (e === 'net::ERR_NETWORK_IO_SUSPENDED') {
result.exception = 'Connection lost .. reload the page';
} else {
result.exception = 'AJAX Request.send';
}
}
return result;
}
};