已添加类型为“…”的消息的未捕获处理程序
Uncaught handler for message of type “…” already added
我与Shiny
和JavaScript
一起工作。我用JavaScript
扩展Shiny
的功能。这样做,我使用了callbackHandlers。我用JS
实现的click event
观察用户输入。触发事件后,我将所需的数据发送到R
,其中有一个函数处理这些数据。结果再次被发送回JS
,在那里显示处理的数据。
。在我的JS
侧,我有这样的内容:
for(var i = 0; i < radioButtons.length; i++) {
radioButtons[i].onclick = function() {
if (parseInt(this.value) === 10) {
Shiny.onInputChange("go", this.value);
Shiny.addCustomMessageHandler("someCallbackHandler1", function(someJson) {
someFunction(someJson);
});
} else if (parseInt(this.value) === 11) {
Shiny.onInputChange("go", this.value);
Shiny.addCustomMessageHandler("someCallbackHandler2", function(someJson) {
someFunction(someJson);
});
} // more else if checking for the value
....
在R
这边,我这样做
observe({
if( !is.null(input$go) ) {
if( (input$go == 10) ) {
sendToJs1[["myJson"]] <- someFunctionIwrote(arg1, arg2, arg3, arg4)
session$sendCustomMessage(type = "someCallbackHandler1", sendToJs1$myJson)
} else if( (input$go == 11) ) {
sendToJs2[["myJson"]] <- someFunctionIwrote(arg1, arg2, arg3, arg4, arg5, arg6)
session$sendCustomMessage(type = "someCallbackHandler2", sendToJs2$myJson)
} # more else if checking for which value gets send from js
....
当我点击值为10
的radioButton
时,然后在radioButton
上,值为11
和,然后在radioButton
上再次点击值为10
的,我得到这个。
已添加类型为" someecallbackhandler1 "的消息的未捕获处理程序
因此JS
注意到callbackHandler1
已经被添加,并且不再添加它。但为了显示数据,我需要再次添加它。此外,如果输入数据发生变化,并且someFunctionIwrote(arg1, arg2, arg3, arg4)
使用不同的输入数据执行,JS
会做什么?当然callbackHandler1
已经添加了,但是里面的是什么,从R
发送到JS
的结果是不同的。
我该如何处理这种情况?
我的建议是:
-
只定义一次javascript事件处理程序,并且在循环之外。不需要多次定义它们。一旦它们被创建,它们将持续侦听来自服务器的消息。
-
确保处理程序中声明的回调函数足够灵活,可以处理所有服务器响应。所以你的函数
someFunction()
应该能够处理来自服务器的所有可能的消息。
所以代码应该是:
// function to be called from inside the callback functions:
function someFunction(someJson){
console.log("No matter what someJson is, I will handle them all properly!");
...
}
// set the event handlers for message from server:
Shiny.addCustomMessageHandler("someCallbackHandler1", function(someJson) {
someFunction(someJson);
});
Shiny.addCustomMessageHandler("someCallbackHandler2", function(someJson) {
someFunction(someJson);
});
// set the event handlers for radio button clicks:
for(var i = 0; i < radioButtons.length; i++) {
radioButtons[i].onclick = function() {
if (parseInt(this.value) === 10) {
Shiny.onInputChange("go", this.value);
} else if (parseInt(this.value) === 11) {
Shiny.onInputChange("go", this.value);
} // more else if checking for the value
相关文章:
- 在node.js应用程序中接收JMS消息
- 为我的rails应用程序显示javascript弹出消息
- Chrome扩展程序,如何将消息从面板发送到内容脚本
- jQuery setTimeout ajax递归函数在即时消息程序中短时间后抛出错误
- 正在获取丢失的错误处理程序套接字消息,无法读取属性'timerID'使用Node.js和Socket.i
- 为什么我的消息没有用这个处理程序发送到Socket.io房间
- 如何在tizen网络应用程序上获取消息正文
- 如何将消息从 chrome 扩展程序发送到另一个扩展程序
- Pebble Watchface向Android应用程序发送消息
- 引导程序引导盒在消息中显示变量
- 如何使用 postMessage 作为序列化程序隔离消息
- Windows 8 Javascript应用程序多个消息警报
- 在 chrome 扩展程序中向用户显示消息
- 从Windows C#程序到基于Web的JavaScript的消息传输
- 是否有JQuery或Javascript警告消息实用程序,可以在不干扰用户的情况下显示和超时
- 在应用程序无法正常工作 Asp.net 抛出警报消息
- 无法将消息从 Chrome 扩展程序中的弹出窗口.js发送到后台.js
- 无法在“导航器”上执行“注册协议处理程序”:方案“消息”不属于方案白名单
- 检测iOS设备上是否安装了应用程序并显示适当的消息
- 安装程序 prerender.io 仅从 PhantomJS 输出错误消息