2016-05-16 2 views
0

Я хотел бы создать предложение angularJS, которое работает с socket.io. Я в настоящее время обратного вызова набор для борьбы с ответом:

function request(event, data, callback) { 
    socket.emit(event, data); 
    socket.on(event, function(d) { 
     socket.off(event); 
     callback(d); 
    }); 
} 

Эта сила меня, чтобы написать что-то вроде:

request('myEvent', 'Hello World !', function(data) { 
    ... 
}); 

Интересно, если бы мы могли использовать обещание (с $ д обслуживание от угловой) :

request('myEvent', 'Hello World !').then(function(data) { 

}); 

Спасибо!

+0

также обещания могут только разрешать или отклонять. произойдет ли событие более одного раза? вам все равно, если это случилось больше? –

+0

Скажем, события разворачиваются один за другим. – Arpp

ответ

2

Вы можете попробовать что-то вроде

function request(event, data) { 
    var deferred = $q.defer(); 
    socket.emit(event, data); 
    socket.on(event, function(d) { 
     socket.off(event); 
     deferred.resolve(d); 
    }); 
    return deferred.promise; 
} 

Затем вы можете использовать

request('myEvent', 'Hello World !').then(function(data) { 

}); 
+0

Отлично! Спасибо :). – Arpp

1
function request (eventName, data) { 
    return $q(function (resolve, reject) { 
    socket.emit(eventName, data); 
    socket.on(eventName, function (data) { 
     socket.off(eventName); 
     resolve(data); 
    }); 
    }); 
} 
1

также обещания могут только разрешить или отклонить те. произойдет ли событие более одного раза? вам небезразлично, если это произошло больше, чем

Если вы в порядке с вашим мероприятием, стреляющим только 1 раз, тогда вы можете пообещать ему.

function request(event, data, callback) { 
    socket.emit(event, data); 
    socket.on(event, function(d) { 
     socket.off(event); 
     callback(d); 
    }); 
} 

становится:

function request(event, data) { 
    return $q(function(resolve, reject) { 
     socket.emit(event, data); 
     socket.on(event, function(d) { 
      socket.off(event); 
      resolve(d) 
     }); 
    }); 
} 

Вы будете его использовать:

request('event', data).then(....) 
0

У меня была проблема, когда я оберните socket.on (событие) в функции и вызвать функцию более onceit откроет несколько из них. Таким образом, socket.on (event) вызывается несколько раз, когда бэкэнд вызывает конкретное событие сокета. Если исправлено это с помощью $ rootScope. $, На котором может быть только один экземпляр.

this.search = (query) => { 

    var deferred = $q.defer(); 

    socket.emit('search', {query: query}) // send data to backend 

    $rootScope.$on('search', function(event,data){ 

     deferred.resolve(data); 

    }); 

    return deferred.promise; 
} 

//get data back from backend 
socket.on('search',(data) => { 

    $rootScope.$emit('search',data); 

}); 

Код отверстия завернут внутри услуги Angularjs. Для того, чтобы получить данные теперь от socket.on («Поиск»), вы можете сделать что-то вроде этого:

SocketioService.search('Some query').then((data) => { 
    //do something with the data from the backend 
}) 

Не уверен, что это лучшее решение, но это работает :)

Смежные вопросы