Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么控制台中eval()内的日志比eval()后的日志显示得晚?_Javascript_Logging_Eval_Devextreme - Fatal编程技术网

Javascript 为什么控制台中eval()内的日志比eval()后的日志显示得晚?

Javascript 为什么控制台中eval()内的日志比eval()后的日志显示得晚?,javascript,logging,eval,devextreme,Javascript,Logging,Eval,Devextreme,当我试图弄清楚为什么我的网页dxview的加载过程需要这么长时间时,我决定在该过程的eval部分之前和之后的代码中以及该eval中的字符串中放入一些console.log语句。看起来有点像这样: console.log("Timestamp before eval: " + (new Date().getTime())); eval("... console.log('Some log in here'); ..."); console.log("Timestamp after eval: "

当我试图弄清楚为什么我的网页dxview的加载过程需要这么长时间时,我决定在该过程的eval部分之前和之后的代码中以及该eval中的字符串中放入一些console.log语句。看起来有点像这样:

console.log("Timestamp before eval: " + (new Date().getTime()));
eval("... console.log('Some log in here'); ...");
console.log("Timestamp after eval: " + (new Date().getTime()));
有趣的是,结果的顺序与我预期的不同:

"Timestamp before eval: 1423852110738"
"Timestamp after eval: 1423852110787"
"Some log in here"
这使得检测实际耗时的部分变得非常困难,因为使用时间戳这种方式甚至不能指示eval是否是问题所在

将日志放在eval'ed字符串的开头和结尾表示eval实际需要250到350毫秒来处理,而两个时间戳之间的差异仅为49毫秒。但是,在调用viewshowed方法之前,需要另外23000毫秒

好的,如果您不使用web workers或超时/间隔,JS应该在语句完成之后而不是之前继续使用代码。我可能有点困惑,但这怎么行呢


您好,jaySon我能想到的唯一原因是,在eval中,您是否将console.log放在异步回调中,这将解释console.log消息的顺序

如果所有内容都是同步的,则消息的顺序应为:

"Timestamp before eval: 1423852110738"
"Some log in here"
"Timestamp after eval: 1423852110787"
我的建议是,不要在eval之后记录结束时间,而是计算eval部分实际结束的时间,这意味着所有异步方法都完成了,并在那里记录结束时间

例如,如果eval中有一个异步函数:

console.log("Timestamp before eval: " + (new Date().getTime()));
eval("setTimeout(function(){
    console.log('Timestamp after eval: ' + (new Date().getTime()));
}, 1000);");
通过这种方式,您应该能够准确地计算出完成所有函数需要多长时间


谢谢。

ps,对于控制台中快速脏的时间戳,您可以更懒:console.logTimestamp before eval:,+new Date;或者在任何现代浏览器上:console.logDate.now+@dandavis:console.log不是异步的。但是,如果在某些版本的控制台中,在控制台打开的情况下记录对象,则在以后展开对象时可能会显示其内容。但是记录简单字符串不会表现出这种行为。杰森,你所展示的代码并没有产生你所描述的输出:我的猜测是。。。重要的是,评估中的魔法密码是什么。我猜你在做一些异步的事情。