当前位置: 首页 > Web前端 > HTML

关于JS console.log() 是同步 or 异步引发的问题

时间:2023-03-28 12:24:07 HTML

关于JSconsole.log()issynchronousorasynchronousVirtualDOM引起的问题。constvnode={type:"div",children:[{type:"p",children:"text",},],};constapp=文档。querySelector("#app");渲染器。渲染(vnode,应用程序);vnode.children=[{type:"input",props:{value:"请输入关键字",},},];在渲染函数中打印虚拟DOM的值,结果是修改虚拟DOM代码放入setTimeout函数中setTimeout(()=>{vnode.children=[{type:"input",props:{value:"请输入关键字",},},];});findprint结果不变,仍然是修改后的虚拟DOM。然后修改setTimeout的回调时间为2000ms就可以得到我想要的结果了。推测是渲染函数中有导致异步操作的代码。定位问题根据渲染过程,在代码中找到了可能导致异步的代码:document.createElement(localName,options);insertBefore(node,child)然后去DomStandard中找到这两个的具体定义methods:在第一节createElement的六步中返回了创建元素的结果,于是去查看创建元素的定义:但是在定义中没有找到异步操作相关的信息。再查看insertBefore的详细定义,结果是一样的。没有证据表明insertBefore涉及异步操作。那么同步操作导致结果异步,那么问题很可能不在渲染函数,所以我直接使用console.log()打印虚拟DOM,果然得到的是最新的虚拟DOM:console.log。log(vnode);setTimeout(()=>{vnode.children=[{type:"input",props:{value:"Pleaseenterkeywords",},},];});对于《你不知道的JavaScript中卷》中问题的回答:异步控制台没有指定控制台如何工作的规范或要求集。*方法系列不是JavaScript的正式组成部分,而是由主机环境决定的(请参阅本书的“类型和语法”部分)添加到JavaScript。因此,不同的浏览器和JavaScript环境可以为所欲为,这有时会造成混淆。特别是在某些情况下,某些浏览器的console.log(..)不会立即输出传入的内容。这样做的主要原因是在很多程序中(不仅仅是JavaScript),I/O是一个非常慢的阻塞部分。因此,(从页面/UI的角度来看)浏览器可以通过在后台异步处理控制台I/O来提高性能,而用户甚至可能没有意识到它正在发生。书中给出了示例和解决方案:如果遇到这种罕见情况,最好的选择是在JavaScript调试器中使用断点,而不是依赖控制台输出。一个次优的解决方案是将对象序列化为一个字符串以强制执行“快照”,例如通过JSON.stringify(..)。问题解决:让vnodeStr=JSON.parse(JSON.stringify(vnode));控制台日志(vnodeStr);参考资料DomStandardconsole.log是异步流吗?感觉踩坑了《你不知道的JavaScript中卷》