gpt4 book ai didi

javascript Socket io 和 promise

转载 作者:行者123 更新时间:2023-11-30 07:53:17 25 4
gpt4 key购买 nike

我正在尝试使用 socket io 和 redux 构建一个消息传递网络应用程序,这 post遇到。我不能在帖子上发表评论来提问,所以我发布了一个新问题来询问该帖子中的答案(抱歉,如果我违反了 stackoverflow 准则,但我似乎没有办法发表评论。)我的部分不明白的是

在 socketClient.js 中

 emit(event, data) {
return new Promise((resolve, reject) => {
if (!this.socket) return reject('No socket connection.');

return this.socket.emit(event, data, (response) => {
// Response is the optional callback that you can use with socket.io in every request. See 1 above.
if (response.error) {
console.error(response.error);
return reject(response.error);
}

return resolve();
});
});
}

this.socket.emit中的回调函数不太明白。据我了解,当服务器从客户端接收到事件、数据和回调函数时,回调函数将在服务器端执行。如果是这样,那么回调函数中的return是做什么的呢? response 应该是什么? this.socket.emit 应该返回什么?以及服务器如何解决客户端的 promise ?

最佳答案

I don't quite understand the callback function in this.socket.emit.

当您将回调作为第三个参数传递给 socket.io 的 .emit() 方法时,它会告诉 socket.io 您想要一个服务器已收到消息的确认和一个可选的响应从服务器返回。该回调将在服务器收到您的消息并在其端调用回调后调用,并且服务器可以选择发送回响应。

回调中的 return 语句仅用于控制流。它们只是导致代码在回调中停止执行。人们往往会忘记 reject()resolve() 只是函数调用。它们不会导致函数的其余部分停止执行。

您显示的代码可以这样写,只有一个 return 语句来返回 promise :

 emit(event, data) {
return new Promise((resolve, reject) => {
if (!this.socket) {
reject('No socket connection.');
} else {
this.socket.emit(event, data, (response) => {
if (response.error) {
console.error(response.error);
reject(response.error);
} else {
resolve();
}
});
}
});
}

在这里,它使用if/else 来控制程序流,而不是使用return 来提前停止函数的执行。两者都可以 - 个人喜好。

If that's the case, what does the return do in the callback function?

它只是停止在回调函数内执行更多代码。只是控制流程的事情。回调没有返回有意义的值。

what should response be?

response 将是服务器作为确认的一部分发送的任何内容。

what should this.socket.emit return?

this.socket.emit() 恰好返回 socket 本身(允许方法链接)。但是,这在这里不相关,因为从 Promise 执行器函数返回任何值是没有意义的。如果您确实返回了一个值,则 Promise 不会以任何方式使用它。基本上,原始代码中有太多的 return 语句。他们会让人认为返回值是相关的,而实际上却不是。它们没有害处,但会混淆代码的正确意图和含义。

and how can the server resolve a promise on client side?

服务器实际上并没有解决客户端的 promise 。客户端定义一个 promise ,该 promise 将在从服务器获得响应时解决。因此,当该响应从服务器返回时,接收该响应的客户端自己的回调代码,然后解析其自己的 promise 。

What I don't get still is the callback function. So the client sends data and a callback function A to the server, and the server can call this function A in it's own callback. Function A will NOT be executed on client side, is this understanding correct? If so, then why is there resolve and reject in callback function A?

没有。事实并非如此。客户端在调用 .emit() 时指定一个回调函数给 socket.io。这告诉客户端 socket.io 库客户端希望获得对此消息的确认。这导致 socket.io 库在它发送给服务器的消息包中设置一个额外的位,以告诉服务器客户端需要确认。没有回调被发送到服务器,只有确认位的请求。然后,当服务器收到消息时,它可以调用服务器端的 socket.io 回调说“是的,我确认我收到了这条消息”,它也可以发送响应。当服务器调用该 socket.io 回调时,socket.io 将向客户端发送一个确认数据包(其中嵌入了匹配的消息 ID)。 socket.io 客户端库将看到传入的确认数据包,找到该数据包中的消息 ID 和任何服务器响应数据,找到与消息 ID 相关的客户端确认回调并调用它。客户端将看到它的函数被调用,这告诉它服务器确实收到了它的消息。然后,在您的客户端代码中,该回调将解析 promise 。

关于javascript Socket io 和 promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com