javascript Socket io和Promise

I-P*_* Ou 1 javascript sockets node.js

我正在尝试使用套接字io和redux构建一个消息传递Web应用程序,并且这篇文章经常出现。我无法在帖子中发表评论以提出问题,因此我在该帖子中发布了一个新问题,以询问答案(对不起,如果我违反了stackoverflow quideline,但似乎没有办法发表评论。)不明白的是

在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();
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

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

jfr*_*d00 6

我不太了解this.socket.emit中的回调函数。

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

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

您显示的代码可能是这样写的,只有一个return语句返回诺言:

 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();
                 }
             });
         }
     });
 }
Run Code Online (Sandbox Code Playgroud)

在这里,它用于if/else控制程序流程,而不是return用于尽早停止执行功能。谁都可以工作-个人喜好。

如果是这样,则return在回调函数中做什么?

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

应该如何回应?

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

this.socket.emit应该返回什么?

this.socket.emit()碰巧返回socket本身(允许方法链接)。但是,这无关紧要,因为没有必要从Promise执行程序函数返回任何值。如果您确实返回一个值,则Promise不会以任何方式使用它。基本上,return原始代码中的语句太多。他们导致人们认为返回值无关紧要。它们没有害处,但确实掩盖了代码的正确意图和含义。

服务器如何解决客户端的承诺?

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

我仍然不知道的是回调函数。因此,客户端将数据和回调函数A发送到服务器,服务器可以在其自己的回调函数中调用此函数A。函数A不会在客户端执行,这种理解正确吗?如果是这样,那么为什么在回调函数A中存在解析和拒绝?

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