2011-04-20 37 views
2
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.errortrue 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/

那就是答案。有一个愉快的一天人们! ;)

+3

为什么使用'eval()'而不是'JSON.parse()'? – ThiefMaster 2011-04-20 08:49:01

+0

嗯......可能是因为这是我发现的第一个解决方案^^。我将eval()部分更改为JSON.parse(result),但问题仍然存在。 :(alert()muste已经完成了响应,所以它的beeing认可方式不同。但是什么? – Jonny 2011-04-20 09:01:08

+0

你怎样/何时调用你的回调函数? – RoToRa 2011-04-20 11:14:55

回答

2

只是一个一般的建议:不要混合有或没有{}块。以下表格更具可读性,您可以更快地找出问题所在。

console.log(json); 
if (json.criticalerror == true) { 

    console.log("criticalerror"); 
    dialogCriticalError(json.errormessage); 

} else if (json.error == true) { 

    console.log("error"); 
    dialogError(json.errormessage); 

} else { 

    console.log("something else"); 
    // Do something else 
} 
+0

感谢您的建议...其绝对好像那样:) 但问题仍然存在:( – Jonny 2011-04-20 09:08:52

+0

@J onny我添加了一些'console.log'行。他们在现代浏览器中工作,比警报更好()。也许这将有助于确定发生了什么问题。 – vbence 2011-04-20 09:37:15

+0

好吧,现在我发现它与alert()一起工作的原因不是警报,而是我能够关闭对话框之前经过的时间。我尝试在JSON-repsonse和回调函数的调用之间放置一个“setTimeout”。结果:100ms足够了,它工作。现在的问题是。为什么?? (@vbence:感谢您的建议,我会在将来尝试......) – Jonny 2011-04-20 10:00:54

0

看来问题是时间。如果我 在 JSON结果和实际回调之间放置了100ms的延迟, 一切正常。但这 不可能是正确的...我是 一种无知。

听起来像你在做异步(ajax)通信。代码的其余部分向服务器请求一些数据。你在服务器给你之前处理结果。这解释了延迟。

+0

是的,它是异步的。但这是seam框架在后台处理的东西。在文档中说,在服务器方法完成工作后,回调函数被调用。所以通常这不应该是一个问题。但当然我不知道它在背景中究竟是如何工作的......但它有助于知道JavaScript本身没有问题:)至今为止感谢! – Jonny 2011-04-20 12:17:32

相关问题