@dokdetroit
изучаю javascript для души

Как улучшить код для работы с ajax без jquery?

Хочу полностью уйти от jquery, однако нельзя не признать, что с ней удобно работать с ajax. Написал следующий сниппет:
"use strict";

let $_ajax = (function(){
	class Ajax {
		constructor() {
			this.XHR = new XMLHttpRequest();
		}

		_send(params) {
			if(params.sync === undefined) params.sync = true;
			    let x = this.XHR;
			    x.open(params.method, params.url, params.sync);
			    x.onreadystatechange = function() {
			        if (x.readyState == 4)
			            params.callback(x.responseText)
			    };
			    if (params.method == 'POST')
			        x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

			    if(params.prepare)
			    	this.prepare(params.prepare);

			    if(params.progress)
				    this.progress(params.progress);

			    x.send(params.data);
		}

		prepare(callback) { //метод, который вызывается перед отправкой запроса, если указан params.prepare
			callback();
		}
		progress(callback) { //метод-обертка для события onprogress; вызывается если указан параметр params.progress
			this.XHR.onprogress = function(e) {
				callback(e)
			}
		}

		/*
		в следующие методы будем передавать единственный аргумент вида:
		params = {
			url: string, - адрес, по которому идет запрос
			data: object, - объек, содержащий данные
			callback: function, - функция обратного вызова
			sync: bulean, - параметр, определяющий ассинхронность
			prepare: function, - функция перед отправкой запроса
			progress: function - функция индикатор прогресса
		}
		*/

		get(params) {
		    let query = [];
		    for (let key in params.data) {
		        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(params.data[key]));
		    }

		    this._send({
		    	url: params.url + (query.length ? '?' + query.join('&') : ''),
		    	callback: params.callback,
		    	method: 'GET',
		   		data: null,
		   		sync: params.sync,
		   		prepare: params.prepare,
		   		progress: params.progress 
		    });
		};

		post(params) {
		    let query = [];
		    for (let key in params.data) {
		        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(params.data[key]));
		    }
		    
		    this._send({
		    	url: params.url,
		    	callback: params.callback,
		    	method: 'POST',
		   		data: query.join('&'),
		   		sync: params.sync,
		   		prepare: params.prepare,
		   		progress: params.progress
		    });
		};

	}
	return new Ajax();
})();

и потом вызываем так:
$_ajax.post({
                    url: 'res.php',
                    data: data,
                    callback: function(response) {
                        // код функции
                    },
                    prepare: function() {
                        // код функции
                    },
                    progress: function(e) {
                        // код функции
                    }
                });

Как видите, всё оформлено в новомодном es6. Посоветуйте, что изменить/доработать/убрать/оптимизировать?
p.s. методы readystatechange и load взаимозаменяемы или нет? Второй как я понял является более современным вариантом для XHR2
  • Вопрос задан
  • 785 просмотров
Пригласить эксперта
Ответы на вопрос 2
AndreyBerezhnoy
@AndreyBerezhnoy
WordPress Developer at The White Label Agency
Извините, но чем, собственно, Вас не устроил jQuery?:)
Ответ написан
DIITHiTech
@DIITHiTech
Fullstack javascript developer
Этот велосипед, если он не чисто для обучения, никому не нужен. Если уже использовать ES6 то можно и новый fetch (https://learn.javascript.ru/fetch). А если уж так хочется, то ajax api в jquery style уже никому не интересен пару лет, как появились Promises. Так что лучше уж очередной полифил fetch'a изобретать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы