为什么eval()中的日志出现在控制台的后面,而不是eval()之后的日志?

时间:2015-02-13 19:11:52

标签: javascript logging eval devextreme

当我试图找出为什么我的网页(dxview)的加载过程需要这么长时间时,我决定在console.log()之前和之后的代码中放入一些eval()语句(部分该过程)和非常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的字符串开头和结尾处表示eval实际需要 250到350毫秒来处理,而两个时间戳之间的差异只是 49毫秒。但是,在调用viewShown方法之前,需要另外 23,000+ ms

AFAIK,如果你不使用网络工作者或超时/间隔,JS应该在声明完成之后(而不是之前)继续使用代码。我可能会在这里混淆一​​些东西,但是这怎么可能呢?

亲切的问候,
jaySon

1 个答案:

答案 0 :(得分:0)

我能想到的唯一原因是,在eval()中,你是否将console.log()置于异步回调中,这将解释console.log消息的顺序。

如果一切都是同步的,则消息的顺序应为:

"Timestamp before eval: 1423852110738"
"Some log in here"
"Timestamp after eval: 1423852110787"

我的建议是,不是在eval()之后记录结束时间,而是找出eval()部分实际结束的时间(意味着所有异步方法完成),并记录结束时间< strong>就在那里。

例如,如果你在eval()中有一个异步函数:

console.log("Timestamp before eval: " + (new Date().getTime()));
eval("setTimeout(function(){
    console.log('Timestamp after eval: ' + (new Date().getTime()));
}, 1000);");

以这种方式,您应该能够确切地知道完成所有功能需要多长时间。

感谢。