尝试在 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/