我正在使用socket.io,我想将回调函数转换为一个简单的基于promise的函数,我可以返回一个值。
我试图转换此处找到的确认:socket.io/docs/#sending-and-getting-data-(ackenowledgements)
socket.on('getGames', (data, callback) => {
Game.find(data)
.then(data => callback(data)); //explicit call to callback
});
我想调用一个函数,例如:
socketEvent(socket, 'getGames')
.then((data) => {
return Game.find(data); //returns a promise and can be chained
});
我想的是:
//this doesn't work
const socketEvent = (socket, name) => {
return new Promise(function (resolve, reject) {
socket.on(name, (data, callback) => {
resolve((data) => callback(data));
});
});
};
答案 0 :(得分:1)
只需resolve(data)
。不需要内部功能。这将流入承诺链。
如果出现问题,也不要忘记致电reject
。
答案 1 :(得分:1)
您的第二个代码段与第一个代码段不同。在第一个中,有一种机制可以在Game.find()
检索到其值时发送确认,但在第二个中,它无法在完成时发回确认。
我认为这可能与您尝试做的很接近:
const socketEvent = (socket, name) => {
return new Promise(function (resolve, reject) {
socket.on(name, (data, sendBack) => resolve({ data, sendBack }));
});
};
然后您可以像这样使用它:
socketEvent(socket, 'getGames')
.then({ data, sendBack } => Game.find(data).then(sendBack))
.then(... more stuff);
然而,正如其他人所指出的那样,这与原始代码之间仍然存在很大差异,因为承诺版本只会捕获事件一次(这是承诺如何工作)。如果你需要设置一个机制来多次捕获同一个事件,那么promises不是正确的工具,你需要使用回调或者像observables这样的东西。