2016-05-16 141 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) { 
    ... 
}); 

我不知道是否我们可以使用一个承诺(与角$ Q服务) :

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

以及承诺只能解决或拒绝的。这件事会不会发生一次?你是否在乎它是否发生了多于一次

如果你确定你的事件发射只有一次,那么你可以承诺是的。

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(事件),并调用该函数不止一旦它将打开它们的多个。所以当后端调用特定的套接字事件时,会多次调用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 
}) 

不知道这是最好的解决方案,但它的工作原理:)