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

Javascript 如何将此回调参数转换为承诺?,javascript,callback,socket.io,promise,es6-promise,Javascript,Callback,Socket.io,Promise,Es6 Promise,我使用的是socket.io,我想将回调函数转换成一个简单的基于承诺的函数,在这里我可以返回一个值 我正在尝试转换这里找到的确认:socket.io/docs/#发送和获取数据-(确认) 我想调用一个函数,例如: socketEvent(socket, 'getGames') .then((data) => { return Game.find(data); //returns a promise and can be chained }); 我的想法是:

我使用的是socket.io,我想将回调函数转换成一个简单的基于承诺的函数,在这里我可以返回一个值

我正在尝试转换这里找到的确认:socket.io/docs/#发送和获取数据-(确认)

我想调用一个函数,例如:

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));
        });
    });
};
只需
解析(数据)
。不需要内部函数。这将流入承诺链

当出现问题时,也不要忘记调用
reject

只要
解决(数据)
。不需要内部函数。这将流入承诺链


当出现问题时,也不要忘记调用
reject

您的第二个代码段与第一个代码段不同。在第一种方法中,有一种机制可以在
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);

然而,正如其他人所指出的,这段代码与原始代码之间仍然存在很大的差异,因为promise版本只捕获一次事件(promise就是这样工作的)。如果您需要设置一种机制来多次捕获同一事件,那么承诺就不是该工作的正确工具,您需要使用回调或类似于可观察的东西。

您的第二个代码段与第一个代码段不相似。在第一种方法中,有一种机制可以在
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);


然而,正如其他人所指出的,这段代码与原始代码之间仍然存在很大的差异,因为promise版本只捕获一次事件(promise就是这样工作的)。如果您需要设置一种机制来多次捕获同一事件,那么Promissions就不是合适的工具,您需要使用回调或类似observables的方法。

这不起作用,因为我没有调用
回调
来返回
数据。当承诺得到解决时,我需要调用
回调
。@Nazzanuk你能链接到一些文档吗?@Nazzanuk你想发回什么数据?它从哪里来?@DanielA.White因此我试图转换这里找到的确认:@JLRishe信息只是一个示例,因此在本例中,
Game.find(data)
使用
数据
对象查询MongoDB。但是任何异步承诺都可以放在这里。这不起作用,因为我没有调用
回调
返回
数据
。当承诺得到解决时,我需要调用
回调
。@Nazzanuk你能链接到一些文档吗?@Nazzanuk你想发回什么数据?它从哪里来?@DanielA.White因此我试图转换这里找到的确认:@JLRishe信息只是一个示例,因此在本例中,
Game.find(data)
使用
数据
对象查询MongoDB。但是任何异步承诺都可以放在这里,你可能根本不应该放在这里。套接字可能会多次触发事件,而promise是表示该事件的错误工具。无论如何,它都会多次触发回调。上下文没有那么重要-我仍然想知道如何将上面的显式回调转换为承诺。承诺不能多次触发,你在这方面运气不好。对于一般情况,您似乎对socket.io回调函数有点困惑。您可以在发送消息时注册回调函数,该消息将向您确认另一端已收到该消息。您在收到传入消息时不会使用该回调。@jfriend00谢谢,这帮助我理解了我的错误。我所说的回调实际上是一个作为参数公开的send函数。我仍然想“承诺”这一行动,但我现在就不做了。你可能根本不应该这样做。套接字可能会多次触发事件,而promise是表示该事件的错误工具。无论如何,它都会多次触发回调。上下文没有那么重要-我仍然想知道如何将上面的显式回调转换为承诺。承诺不能多次触发,你在这方面运气不好。对于一般情况,您似乎对socket.io回调函数有点困惑。您可以在发送消息时注册回调函数,该消息将向您确认另一端已收到该消息。您在收到传入消息时不会使用该回调。@jfriend00谢谢,这帮助我理解了我的错误。我所说的回调实际上是一个作为参数公开的send函数。我仍然想“承诺”这项行动,但我现在就不做了。