使用 ack SocketIO 与 iOS 发出

Posted

技术标签:

【中文标题】使用 ack SocketIO 与 iOS 发出【英文标题】:Emit with ack SocketIO with iOS 【发布时间】:2018-11-20 10:44:16 【问题描述】:

我正在尝试使用回调进行发射,但似乎服务器无法将回调函数识别为函数。我查阅了文档,据我所知,代码应该可以工作。

这是我得到的错误:TypeError: callBack is not a function

这是客户端代码:

socket?.emitWithAck("connectUsername", username).timingOut(after: 2, callback:  (data) in
            
        print(data)
    )

和服务器代码:

socket.on("connectUsername", function(username, callBack)
    
        //Do stuff with username here...

        var id = socket.id
        callBack(id);
     );

感谢任何帮助。

【问题讨论】:

【参考方案1】:

@kiddosrails 提到的问题是超时 2 秒是执行时间更少,您可以设置超时 0 表示不超时。希望这个答案对您有所帮助。

     socket.emitWithAck("connectUsername", username).timingOut(after: 0) data in
      print(data)    
    

【讨论】:

服务器控制台依然报同样的错误:TypeError: callBack is not a function 可以分享socket.io的控制台日志吗?【参考方案2】:

我在文档中没有将回调视为timingOut 的参数。以下应该工作:

socket.emitWithAck("connectUsername", username).timingOut(after: 20)  data in 
  print(data)

如果上述方法不起作用,请通过将其更改为以下内容来检查 究竟 是什么回调:

socket.on("connectUsername", function(username, callBack)
    
        //Do stuff with username here...

        var id = socket.id
        console.log(callBack.toString());
     );

【讨论】:

我一到家就测试一下 如果我在客户端删除callBack参数,编译器会报错并建议重新添加。如果我尝试检查“callBack”的字符串,控制台中会发生以下情况:/Users/xxxx/Documents/socket-training/index.js:69 console.log(callBack.toString()); ^ 类型错误:无法读取未定义的属性“toString”【参考方案3】:

iOS 代码

socket?.emitWithAck("connectUsername", data).timingOut(after: 0) data in
            print(data) 
        

服务器代码

var io = socketIO.listen(server);
io.sockets.on('connection', function(client)
    console.log('a user connected..!!!!!');
    client.on('connectUsername', function(username, callBack)
        var id = socket.id
        callback(
        ID:id,
        Message: "Successfully."
        );
    

【讨论】:

服务器控制台依然报同样的错误:TypeError: callBack is not a function 请检查更新的答案,如果您仍然遇到任何问题,请告诉我 这正是我的代码写出的方式,我可以成功连接用户并执行其他操作,但是一旦我尝试使用回调进行发射,它就会崩溃。 请问您在服务器端和ios端使用的是哪个socket.io版本 服务器:socket.io@2.1.1 - 客户端:'Socket.IO-Client-Swift','~> 13.2.0'【参考方案4】:

在您的服务器代码中:

socket.on("connectUsername", function(username, callBack)
    
        //Do stuff with username here...

        var id = socket.id
        callBack = (id);
     );

这是因为回调没有像对象一样定义,所以你可以像对象一样定义它。

【讨论】:

请说明您的方法的原因,以便其他人可以轻松理解

以上是关于使用 ack SocketIO 与 iOS 发出的主要内容,如果未能解决你的问题,请参考以下文章

从socketIo python发出事件

向所有客户端发出的 SocketIO 不起作用

向特定用户发出的 SocketIO(不为每个客户端使用单独的房间)

Android socket.IO中的Emit或Ack超时处理?

Flask-socketio,向另一个命名空间发出事件

来自异步芹菜工作者的 SocketIO 发出不工作