如何将此回调参数转换为承诺?

时间:2017-02-17 15:08:45

标签: javascript callback socket.io promise es6-promise

我正在使用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));
        });
    });
};

2 个答案:

答案 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这样的东西。