JavaScript的Socket io和诺言
我正在尝试使用套接字io和redux来构build一个消息传递web应用程序,而且这篇文章会遇到。 我不能发表评论提出问题,所以我张贴一个新的问题,问在这个post的答案(抱歉,如果我违反了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(); }); }); }
我不太明白这个.socket.emit中的callback函数。 据我所知,callback函数将在服务器端执行,当服务器接收到来自客户端的事件,数据和callback函数。 如果是这种情况,callback函数在callback函数中做了什么? 应该response
什么? 这个.socket.emit应该返回什么? 以及服务器如何解决客户端的承诺?
我不太明白this.socket.emit中的callback函数。
当您将一个callback作为第三个parameter passing给socket.io的.emit()
方法时,它会告诉socket.io您希望确认服务器已收到消息并从服务器返回可选的响应。 该callback将在服务器收到您的消息并在其末尾调用callback后被调用,并且服务器可以select发送回应。
该callback中的return
语句仅用于控制stream。 它们只是导致代码在callback中停止执行。 人们往往会忘记, reject()
和resolve()
只是函数调用。 他们不会导致其余的function停止执行。
你显示的代码可能是这样写的,只有一个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
来控制程序stream而不是使用return
来及早停止函数的执行。 要么可以工作 – 个人喜好。
如果是这种情况,callback函数在callback函数中做了什么?
它只是停止在callback函数内执行的代码。 只是一个控制stream的东西。 callback没有意义的价值。
应该回应什么?
response
将是服务器作为确认的一部分发送的任何内容。
这个.socket.emit应该返回什么?
this.socket.emit()
恰好返回socket
本身(允许方法链接)。 但是,这并不重要,因为从Promise执行器函数返回任何值没有意义。 如果你确实返回了一个值,Promise不会以任何方式使用它。 基本上,原始代码中有太多的return
语句。 他们导致人们认为,如果不是,则返回值是相关的。 它们不会造成任何损害,但会掩盖代码的正确意图和含义。
以及服务器如何解决客户端的承诺?
服务器实际上并不解决客户端的承诺。 客户端定义了一个承诺,当它从服务器获得响应时将parsing。 所以,当这个响应从服务器返回时,客户端自己的callback代码接收到这个响应,然后解决它自己的承诺。
我不明白的是callback函数。 所以客户端向服务器发送数据和callback函数A,服务器可以在自己的callback函数中调用这个函数A. 函数A不会在客户端执行,这个理解是否正确? 如果是这样的话,为什么在callback函数A中parsing和拒绝呢?
不,这不是发生了什么事情。 客户端在调用.emit()
时指定一个到socket.io的callback函数。 这告诉客户端socket.io库,客户端会喜欢得到这个消息的确认。 这会导致socket.io库在它发送给服务器的消息包中设置一个额外的位,以告知客户机需要确认的服务器。 没有callback发送到服务器,只有一个确认位的请求。 然后,当服务器收到消息时,它可以调用一个服务器端的socket.iocallback来说“是的,我承认我收到了这个消息”,它也可以发送一个响应。 当服务器调用socket.iocallback函数时,socket.io会向客户端发送一个确认信息包(里面embedded了匹配的信息ID)。 socket.io客户端库将看到传入的确认数据包,find该数据包中的消息ID和任何服务器响应数据,find与消息ID一起使用的客户端确认callback并调用它。 客户端会看到它的函数被调用,告诉它服务器确实收到了它的消息。 然后,在您的客户端代码中,该callback将解决承诺。