Не нужно использовать синхронные запросы, т.к. это существенно замедляет работу веб-приложения и ухудшает отзывчивость интерфейса.
Для работы лучше использовать 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) {
// здесь вы сможете обработать полученные данные от всех серверов
});