如果在开头放了一个alert(),为什么要执行javascript函数?
当执行此回调函数时,调用“dosomething”部分不会出现问题。但是在json.error为true的情况下,不会执行dialogError函数。我已经检查了Firebug中传输的JSON。一切都好。结果是一个JSON字符串 有趣的是,如果我在回调函数的开头使用alert()函数调用JSON响应,它实际上是执行的。我是JavaScript新手,可能遗漏了一些显而易见的东西,但我就是想不出来。臭虫在哪里如果在开头放了一个alert(),为什么要执行javascript函数?,javascript,json,callback,seam,Javascript,Json,Callback,Seam,当执行此回调函数时,调用“dosomething”部分不会出现问题。但是在json.error为true的情况下,不会执行dialogError函数。我已经检查了Firebug中传输的JSON。一切都好。结果是一个JSON字符串 有趣的是,如果我在回调函数的开头使用alert()函数调用JSON响应,它实际上是执行的。我是JavaScript新手,可能遗漏了一些显而易见的东西,但我就是想不出来。臭虫在哪里 编辑: 看来问题在于时间。如果我在JSON结果和实际回调之间加上100毫秒的延迟,一切都
编辑: 看来问题在于时间。如果我在JSON结果和实际回调之间加上100毫秒的延迟,一切都会正常工作。但这不可能是对的。。。我有点不知所措 (哦,顺便说一下:通信是由JBossSeamRemoting完成的) 整个函数如下所示:
var callback = function(result){
//alert(result);
var json = eval('('+result+')');
if(json.criticalerror==true) dialogCriticalError(json.errormessage);
else{
if(json.error==true) dialogError(json.errormessage);
else{
// Do something else
}
}
};
var manager = Seam.Component.getInstance("solverTreeStructure");
Seam框架通过以下功能提供manager对象:
function nextNode() {
var callback = function(result){
var json = JSON.parse(result);
if (json.criticalerror==true) {
dialogCriticalError(json.errormessage);
}else if (json.error==true) {
dialogError(json.errormessage);
}else {
document.getElementById('currentTree').innerHTML = json.state;
document.getElementById('countTrees').innerHTML = json.amountSteps;
document.getElementById('iframe').contentWindow.importGraph(json.tree);
document.getElementById('relevantnode').innerHTML = json.node;
createNodeBar(json);
}
};
manager.nextNode(callback);
}
上次编辑: 好了,现在我知道问题的确切来源了。它不是Seam远程处理,而是dialogError()函数及其用于显示对话框的库 dialogError()函数如下所示:
var callback = function(result){
//alert(result);
var json = eval('('+result+')');
if(json.criticalerror==true) dialogCriticalError(json.errormessage);
else{
if(json.error==true) dialogError(json.errormessage);
else{
// Do something else
}
}
};
var manager = Seam.Component.getInstance("solverTreeStructure");
它使用一个名为TINYBOX的小对话框库。现在,该库提供了各种参数来配置对话框。“mask”参数引起了所有的麻烦。它负责使对话框的背景变暗。如果打开,TINYBOX需要启动延迟才能使用回调函数。(我不知道为什么)
但对于那些喜欢谜语的人:
那是图书馆。它又小又清晰。不幸的是,我的JavaScript技能还不足以理解它。
这就是答案。祝大家今天愉快!;) 只是一个一般性的建议:不要将块与
{}
混合使用。以下表格更具可读性,您可以更快地找出问题
function dialogError(error){
TINY.box.show({html:error,width:250,height:100,close:true,mask:true,opacity:20,topsplit:3})
}
看来问题在于时间。如果我
在两个端口之间设置100毫秒的延迟
JSON结果和实际回调,
一切都很完美。但是这个
不可能是对的。。。我有点
毫无头绪
听起来像是在进行异步(ajax)通信。其中是向服务器请求某些数据的其余代码。您需要在服务器将结果提供给您之前处理它。这就解释了延迟的原因。为什么要使用
eval()
而不是JSON.parse()
?嗯……可能是因为这是我找到的第一个解决方案。我将eval()部分更改为JSON.parse(result),但问题仍然存在:(警报)我肯定对响应做了一些修改,所以它的识别方式有所不同。但是什么?你是如何/何时调用你的回调函数的?@RoToRa:我在问题中添加了完整的函数……啊,对不起,我对Seam不熟悉。我的一般猜测是:回调函数调用得太早了——可能不是作为回调函数,这很简单为什么警报会延迟。我不能说这是怎么发生的。谢谢你的建议…这样肯定更好:)但问题仍然存在:(@Jonny我添加了一些控制台.log
行。它们在现代浏览器中工作,比警报更好()。也许这会有助于识别出哪里出了问题。好吧,现在我发现它与alert()一起工作的原因不是alert,而是在我能够关闭对话框之前经过的时间。我尝试设置了一个“setTimeout”在JSON repsonse和回调函数调用之间。结果:100毫秒就足够了,它起作用了。现在的问题是。为什么??(@vbence:谢谢你的建议。我以后会试试…)@Jonny secrtet可能在于如何设置事件处理程序。是的,它是异步的。但这是seam框架在后台处理的事情。在文档中,它说回调函数是在服务器方法完成工作后立即调用的。所以通常这不应该是个问题。但我当然不知道它确实在后台工作……但是知道javascript本身没有问题是有帮助的:)谢谢!