@Stricker

EmberJS и WebSocket

Приветствую всех. В общем вопрос такой, решились взяться за разработку клиента на EmberJS с использованием WebSocket'ов, и встряли на логике приложения. С JS мы работаем раз второй, раньше лишь по мелкому.
Проблема вот в чем - к примеру у нас есть функция открыть чей-либо профиль, заходим мы на этот профиль через роут, вот вызывается обработчик, который отправит запрос получения данных о пользователе на сервер посредством WebSocket, но ответ же обрабатывает функция onmessage, и надо вылавливать ответ от туда и как-то передавать его в нашу функцию.

Будьте добры, расскажите что да как.
  • Вопрос задан
  • 2756 просмотров
Решения вопроса 1
Zerstoren
@Zerstoren
Знаком с траблой. Решил проблему, с помощью обертки.

Если кратко, вызывая у обертки send, первый параметр, роут на сервере. Второй - данные, Третий не обязательный callback функция.

Если есть callback, то на сервер уходят данные, а последний элемент объекта __async с случайным числом. Когда сервер принимает такое сообщение, он выполняет обработку и в ответе добавляет тот-же __async ключ.

Могу дать исходник этой обертки.

В onMessage если есть этот ключ, просматривается список callback`ов на этот ключ. Если ключ есть, то вызывается функция.

Для тех кто говорит, юзайте ajax. А если у человека на основе этого соединения происходит авторизации и все подготовки? В добавок писать 2 разных интерфейса для одного приложения - бред.

@Stricker Я тоже пишу игрушку и уже пробовал ajax`ы и другие вещи. Не делите интерфейс связи сервера и клиента, запутаетесь еще.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
IonDen
@IonDen
JavaScript developer. IonDen.com
А зачем конкретно в этой ситуации такая схема? Тут вам подойдет обычный ajax-запрос. Вебсокет то нужен для другого, для оповещений, фоновых обновлений и т.п.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
используйте 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. Сокеты нужны для доставки данных о перемещении персонажей, их состоянии... все то что должно передаваться в реалтайме. профили же - это просто ресурсы. их можно один раз загрузить и держать в кэше... ну и т.д.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы