javascript - 在可以读取新数据时获取事件 - chrome.socket.read API

标签 javascript sockets google-chrome-extension google-chrome-app

尝试在 Chrome 版本 25.0.1364.5 dev 上使用 chrome.socket API 使用 TCP 套接字。

查看 documentation对于 chrome.socket.read,似乎没有办法在有新数据可供读取时收到通知。

有一些 sample code对于每 500 毫秒轮询一次读取命令的 TCP 服务器,但我认为这不会高效/准确

// Start polling for reads.
setInterval(this._periodicallyRead.bind(this, socketId), 500);

更令人困惑的是,在'Network Communications' Documentation在“接收数据”部分下,声明可以将特殊处理程序作为 chrome.socket.create

中的 onEvent 选项传递

The parameter is an object with one value 'onEvent' that is a function reference to the method that will be called when data is available on the port.

这个onEvent参数会这样使用

chrome.socket.create(
    'udp', '127.0.0.1', 1337, 
    { onEvent: handleDataEvent }, // <-- call this when new data is available
    createHandler
)

但这似乎只适用于 UDP 连接,因为当我尝试使用它时出现以下错误

Error: Invocation of form 
       socket.create(string, string, integer, object, function) 
       doesn't match definition 
       socket.create(string type, optional object options, function callback)

        at Object.normalizeArgumentsAndValidate (schemaUtils:119:11)
        at Object.<anonymous> (schema_generated_bindings:301:32)
        at chrome-extension://obljaojhdffbpcdfbeoiejegaodfoonp/background.js:11:15
        at chrome.Event.dispatchToListener (event_bindings:387:21)
        at chrome.Event.dispatch_ (event_bindings:373:27)
        at dispatchArgs (event_bindings:249:22)
        at Object.app.runtime.onLaunched (app.runtime:116:7)
        at Object.chromeHidden.Event.dispatchEvent (event_bindings:255:35) 

所以问题是,这样的事情可以通过 TCP 连接来实现吗?不必每 x 毫秒轮询一次 read 方法?

更新

在更好的文档/事件支持出现之前,这是我一直在使用的解决方法。

function onReadHandler(readInfo) {
     // do things with data
     // ....

     // re register handler with callback itself
     chrome.socket.read(socketId,null,onReadHandler);         
}

chrome.socket.read(socketId,null,onReadHandler);

最佳答案

对于 TCP 连接,传递给 socket.read 的回调只会在有新数据可用时执行。 sample code mentioned已修复为仅使用回调而不是 setInterval。

网络文档确实过时了,我们正在努力更新它。如果你想在这些 API 快速变化的日子里避免文档过时的风险,你应该经常检查 API reference docs - 这些是直接从代码生成的,不需要编辑工作。如果您觉得“hacky”:-) 您也可以直接查看 Chromium source code API definitions ( this one is for the socket API )

最后但并非最不重要的一点是 Sublime Text用户,有一个Sublime Chrome Apps and Extensions plugin .它还没有完成,但您已经可以获得代码完成、CSP 验证和一些用于引导的样板。通过 Sublime 安装它 Package Manager .

关于javascript - 在可以读取新数据时获取事件 - chrome.socket.read API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14193201/

相关文章:

java - 套接字数组

java - 使用套接字的 HTTP 响应中的随机字符

javascript - Chrome 扩展程序事件选项卡和 console.log

javascript - 如何将 url 参数从我的应用程序传递到 Chrome 扩展程序?

javascript - 这个循环是什么?

javascript - const 值可以改变

c - select() 在长时间运行后立即超时 (C++)

javascript - chrome.storage.sync.get 未返回完整的 JS 对象

javascript - 尝试运行 npm http-server 时出错

javascript - 内容更新时 JQuery Mobile 会丢失格式