使用socket.io的AngularJS $ q承诺

时间:2016-05-16 13:23:06

标签: javascript angularjs socket.io

我想创建一个与socket.io一起使用的angularJS承诺。我目前有一个回调设置来处理响应:

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) {
    ...
});

我想知道我们是否可以使用承诺(使用角度为$ q的服务):

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

});

谢谢!

4 个答案:

答案 0 :(得分: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) {

});

答案 1 :(得分:1)

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

答案 2 :(得分: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(....)

答案 3 :(得分:0)

当我在一个函数中包装socket.on(event)时,我遇到了问题,并且多次调用该函数将打开其中的多个函数。因此,当后端调用特定的套接字事件时,会多次调用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('search')获取数据,您可以执行以下操作:

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

不确定这是否是最佳解决方案,但它有效:)