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
}
}
};
当执行此回调函数时,“执行其他操作”部分被调用时没有问题。但在这种情况下,json.error是true dialogError函数未执行。我已经检查了Firebug中传输的JSON。一切都好。结果是一个JSON字符串,因为它应该是。为什么JavaScript函数刚刚执行,如果alert()放在开始?
有趣的是,它实际上是是如果我在调用回调函数的开始时用alert()函数调用JSON响应,则执行它。我是JavaScript新手,可能缺少一些明显的东西,但我无法弄清楚。错误在哪里?
编辑:
看来问题是时间。如果我在JSON结果和实际回调之间放置了100ms的延迟,那么一切都完美无缺。但是这不可能是正确的......我有点无知。
(哦,顺便说一下:通信是通过JBoss Seam的远程处理完成)
全功能看起来像这样:
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框架通过以下提供的功能:
var manager = Seam.Component.getInstance("solverTreeStructure");
最后修改:
好吧,现在我明白了问题的根源。它不是Seam Remoting,而是dialogError()函数和它用于显示对话框的库。
的dialogError()函数看起来像这样:
function dialogError(error){
TINY.box.show({html:error,width:250,height:100,close:true,mask:true,opacity:20,topsplit:3})
}
它采用所谓的迷你组合套件一个小对话框库。现在这个库提供了各种参数来配置对话框。 'mask'参数引起了所有的麻烦。它可以让对话框的背景变暗。如果打开它,TINYBOX需要启动延迟才能使用回调函数。 (我不知道为什么)
但是,对于那些谁喜欢谜语:
那库。它非常小而清晰。不幸的是,我的JavaScript技术还不够完善,无法理解它。 http://www.scriptiny.com/2011/03/javascript-modal-windows/
那就是答案。有一个愉快的一天人们! ;)
为什么使用'eval()'而不是'JSON.parse()'? – ThiefMaster 2011-04-20 08:49:01
嗯......可能是因为这是我发现的第一个解决方案^^。我将eval()部分更改为JSON.parse(result),但问题仍然存在。 :(alert()muste已经完成了响应,所以它的beeing认可方式不同。但是什么? – Jonny 2011-04-20 09:01:08
你怎样/何时调用你的回调函数? – RoToRa 2011-04-20 11:14:55