2016-11-21 31 views
1

我有一个非常大的对象,它变成了一个非常非常非常大的JSON字符串。Javascript浏览器执行代码不正常

我有一个上点击收听

randomElement.addEventListener("click", function(){ 
    console.log("should log immediately"); 
    var content = encodeURIComponent(JSON.stringify(veryLargeJson)); 
}); 

veryLargeJson声明/更新的事件监听范围之内。

无论出于何种原因,当我点击的元素,浏览器微调出现,因为它试图字符串化的veryLargeJson,然后对其进行编码,但在控制台登录前发生这种情况。

这个世界正在发生什么?为什么浏览器不按顺序执行JSON.stringify。

我首先想到的是,也许在一般的工作方法事件侦听器闭合或闭合是变量声明一下就首先执行,或其他任何东西发生之前所有变量都解决了。例如,如果我的非常大的json在生成点击的范围之外的范围内声明,那么浏览器立即尝试解析非常大的json,并且因为json非常大而冻结,然后继续并打印出我的控制台日志,并且只有在它之后才将它分配给我在监听器中声明的局部变量。

这是怎么回事?

UPDATE --------------------------------------------- ----------------------

我已经离开了只有背景上述问题。

特别当在事件监听器封闭件的FORMDATA对象和AJAX请求被与非常大的JSON字符串被附加到FORMDATA对象所做出现此问题。

所以我的问题是现在,为什么关闭评估xhttp.send参数失灵?

randomElement.addEventListener("click", function(){ 
    console.log("should log immediately"); 
    var content = encodeURIComponent(JSON.stringify(veryLargeJson)); 
    var formData = new FormData(); 
    formData.append("whatever", content); 
    var xhttp = new XMLHttpRequest(); 
    xhttp.open("POST", "https://randomEndpoint", true); 
    xhttp.setRequestHeader("cache-control", "no-cache"); 
    xhttp.send(formData); 
}); 
+0

你为什么把一个json串起来? json是一个字符串。什么是_browser spinner_? –

+0

这是一个json对象。浏览器微调器是在浏览器做了大量工作并希望阻止用户点击或仅仅想提醒用户浏览器正在工作时发生的事情 –

+0

JavaScript Object Notation对象?请[请阅读更多内容](https://developer.mozilla.org/en-US/docs/Glossary/JSON)了解您使用的术语。 – Oka

回答

1

浏览器不会执行“乱序”处理。除非网络工作者在游戏中,否则所有处理都是在事件处理程序和单线程中完成的。

可能发生的情况是,您观察到控制台日志出现在stringify调用之后,但仍然是之前完成的。

当它看起来可见时,取决于浏览器的GUI事件循环,通常GUI更新只是排队事件,因此它们必须等待点击事件才能完成处理(除非启动嵌套事件循环 - 在Javascript中只发生与alert和朋友)。

如果在stringify呼叫前后添加console.log(+ new Date()),您会注意到操作所需的时间太长。

+0

您是正确的先生。由于负载沉重,xhttp.send调用导致浏览器挂起。在改变了最初的xhttp.open(“POST”,“randomEndpoint”,false);为了真实,我可以在邮政通话执行期间以及退回之前看到我的记录声明。 –

相关问题