Javascript 为什么控制台中eval()内的日志比eval()后的日志显示得晚?
当我试图弄清楚为什么我的网页dxview的加载过程需要这么长时间时,我决定在该过程的eval部分之前和之后的代码中以及该eval中的字符串中放入一些console.log语句。看起来有点像这样: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: "
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不是异步的。但是,如果在某些版本的控制台中,在控制台打开的情况下记录对象,则在以后展开对象时可能会显示其内容。但是记录简单字符串不会表现出这种行为。杰森,你所展示的代码并没有产生你所描述的输出:我的猜测是。。。重要的是,评估中的魔法密码是什么。我猜你在做一些异步的事情。