используйте deferred объекты. Сделайте функцию аля getProfile(), которая будет возвращать обещание что-то сделать. А между делом - отправьте данные в сокет, подпишитесь на прием данных, обработайте их и выполните данное обещание (deferred.resolve(data)).
Будет выглядеть как-то так:
getProfile().then(function(profile) {
}, function (error) {
});
function getProfile(id) {
var deferred = $.Deferred();
someCodeThatSendRequest({
route: 'getProfile',
id: id
}, function (response) {
// preprocess response
deferred.resolve(response);
})
return deferred.promise();
}
Но по хорошему это тупняк. WebSocket тут явно ненужны. Тут нужна нормальная rest-api. Сокеты нужны для доставки данных о перемещении персонажей, их состоянии... все то что должно передаваться в реалтайме. профили же - это просто ресурсы. их можно один раз загрузить и держать в кэше... ну и т.д.