В чем проблема с асинхронным XMLHttpRequest в Javascript?
Я так понял вам промисы нужны?
Не нужно использовать синхронные запросы, т.к. это существенно замедляет работу веб-приложения и ухудшает отзывчивость интерфейса.
Для работы лучше использовать jQuery, это сэкономит вам время на разработку (а ее размер в 33кб сейчас не очень актуален).
Принцип работы простой.
Вы объявляете 2 переменных, первая хранит информацию о количестве выполненных запросов, а вторая о количестве успешных запросов.
По мере выполнения запросов заполняется массив результатов.function doit(params, callback) {
	var results = [], // тут мы сохраним результаты 
	finished=0, // сколько запросов мы выполнили всего 
	succefull=0, // сколько запросов было успешных 
	params = params || {};
	var go = function () {
		if (succefull === 4) {
			callback(results);
		} else if (finished === 4) {
			// сделать что-нибудь, если не все запросы были успешны
			// лучший вариант вызывать функцию callback(results, succefull);
		}
	};
	var whenItDone = function (data) {
		results.push(data); // сохраняем ответ от сервера
		finished++;
		succefull++;
		go();
	};
	var whenItFails = function (data) {
		finished++;
		go();
	};
	// выполнить для разных серверов столько раз, сколько надо
	// данный участок можно завернуть в цикл и передавать внутрь имя сервера
	$.get('path/to/server1', params).done(whenItDone).fail(whenItFails);
	...
	$.get('path/to/server4', params).done(whenItDone).fail(whenItFails);

}
// и где-то потом вызвать 
doit(params, function (setOfRecievedData) {
	// здесь вы сможете обработать полученные данные от всех серверов
});