【问题标题】:Ruby Socket.IO callbackRuby Socket.IO 回调
【发布时间】:2017-01-06 14:56:37
【问题描述】:

我正在使用 Ruby Socket.IO client simple 并尝试使用 Ruby 复制此 JS 代码,但没有成功。 JS 代码按预期工作,但是,Ruby 版本在“auth”发出时不会产生回调输出“身份验证成功”。

虽然 Ruby 中的 auth 是成功的,因为我可以在 auth 之后发出其他私有方法。唯一的问题是为什么回调不起作用

JS

var ws = io('https://test.com')

ws.on('connect', function () {
    auth(ws, pubKey, secKey, function (err, auth) {
        if (err) return console.error('Error', err);
        if (auth.success)
            console.log('Authentication successful');
        else
            console.log('Authentication failed');
    });
});

function auth(ws, pubKey, secKey, cb) {
    var data = { apiKey: pubKey, cmd: 'getAuthInfo', nonce: Date.now() };
    var sig = crypto.sign(data, secKey);
    ws.emit('auth', data, sig, cb);
}

红宝石

require 'socket.io-client-simple'
require 'date'

ws = SocketIO::Client::Simple.connect 'https://test.com'

socket.on :connect do
   auth(ws, pubKey, secKey, method(:auth_callback))
end

def auth(ws, pubKey, secKey, cb)
   data = { apiKey: pubKey, cmd: 'getAuthInfo', nonce: DateTime.now }
   sig = Crypto.sign(data, secKey)
   ws.emit :auth, [data.to_json, sig, cb]
end

def auth_callback(err, auth)
   if auth.success
      puts 'Authentication successful'
   end
end

【问题讨论】:

    标签: javascript ruby callback socket.io


    【解决方案1】:

    auth_callback 不会被调用,因为你没有在任何地方调用它!

    您将方法method(:auth_callback) 作为一个名为cb 的参数传递给auth 方法,但您不使用cb 做任何事情。

    cb 是一个Method,所以你可以在上面使用call。

    没有足够的数据来测试您的代码,所以这里有一个基本示例:

    cb=3.method(:+)
    cb.call(2)
    #=> 5
    

    err 既未定义也未使用,因此您可以将其从 def auth_callback(err, auth) 中删除。

    【讨论】:

    • 谢谢,我明白你的意思,但看起来,我实际上无法在 ruby​​ 中获得 emit 方法的响应,就像在 js 中一样。看起来这是 socket.io-client-simple 包装器的限制
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2013-12-18
    相关资源
    最近更新 更多