CNode

关于socket.io中emit的回调

问答
Mmosaice发布于10 年前最后回复10 年前2 回复5357 浏览0 收藏

我在学习socket.io的时候对着书上的例子照着码,遇到了一段不是很理解 node

  socket.on('search', function (q, fn) {
    superagent.get(api + q)
    .end(function (err, res) {
      if (err) console.log(err);
      console.log(fn());//undefined
      fn(JSON.parse(res.text));
    });
  });

浏览器

  socket.emit('search', song, function (songs) {
	console.log(songs);//在浏览器执行
	return 1;
  });

这段代码看起来像是前端在emit 的时候传了一个回调给node那边,然后superagent 抓完数据后执行了回调, 但是结果是最终emit给的回调是在浏览器执行的

不是很明白为什么在node中调用会在浏览器执行?

查看回复

回复 (2)

H
hisune#1·10 年前

客户端emit后会

  1. 生成一个本地自增idthis.ids++,并带给服务端,同时将回调函数存下来 this.acks
  2. 服务端收到消息后,如果有回调会发送消息给客户端并带上客户端发送的自增id
  3. 客户端接受到消息如果发现服务端回传的自增id在本地有记录onack,执行回调函数,并删除本地的回调函数

大概看了一下,整个过程差不多是这样

M
mosaice#2·10 年前

感谢,我大致翻过node块的源码,水准不太够看通。。 只知道他在维护个什么。。

参与回复
登录后即可参与回复。登录