console.log('start'); setTimeout(function() { console.log('timeout'); }, 0); Promise.resolve().then(function() { console.log('promisel'); }).then(function() { console.log('promise2'); }).then(() => console.log(`promise3`)) async function asyncFunc() { await asyncSubFunc(); Promise.resolve().then(x => { console.log('async end'); }) } async function asyncSubFunc() { console.log('async sub'); return Promise.resolve().then(() => { console.log('async sub promise'); }); } asyncFunc(); console.log('end'); 理想的预期输出: start async sub end promisel async sub promise async end promise2 promise3 timeout 实际浏览器控制台输出为: start async sub end promisel async sub promise promise2 promise3 async end timeout 问题1:await后的代码被执行完成后,为什么没有继续往下,而是继续执行微任务队列中的微任务? 问题2:await后(下一行)的代码会被放在微任务队列中执行,具体的执行时机是?
执行appendChild或removeChild时,会重新计算布局吗?什么时候重新计算布局? 猜测: * 在事件循环中,有一阶段是留给渲染的,是否是在这时重新计算布局?appandChild或removeChild只是改变了dom。 * 在渲染阶段根据改变的这个dom来重新计算布局。 * 如果我添加了一个元素紧接着又删除了,渲染阶段是根本不知道的。即使这个元素上有动画也是不会出现的。 可以试一下这个例子"codesandbox" (https://link.segmentfault.com/?enc=dD6Mi5ysGNPbxw6XaANogA%3D%3D.BBdDvaVzG%2BUUKHNpqEcc8WifPUWgW3dTF8wx6WU7NOCj1ffML7yEu0PGz%2BNE%2FyZpgqTkaPJjFliBBrAbmPYa0Nfc0AXwkNmpbg403ZzLQLw%3D) 其实应该是会重新计算布局的,可以检测一下添加该元素之前和之后其父元素的大小("offsetHeight ..."),它的大小是会发生变化的。 添加类名("classList.add"),也会触发重新布局(检测一下添加类名之后,大小或其他样式是否发生变化就可以验证了)。 有一个动画制作的方法flip,就用到了这个同步布局。