当我试图找出为什么我的网页(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
答案 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);");
以这种方式,您应该能够确切地知道完成所有功能需要多长时间。
感谢。