Javascript 编写依赖于“IntersectionObserver”调用的测试

Javascript 编写依赖于“IntersectionObserver”调用的测试,javascript,testing,browser,intersection-observer,Javascript,Testing,Browser,Intersection Observer,我正在尝试编写一个测试,当元素位于视口中时,该测试将断言某些内容 我使用的是API,事实证明,对观察者的调用是在浏览器能够调用它们时完成的 所以问题是,我应该如何对待这种断言? 我应该等一会儿吗?多少毫秒就足够了? 是否有一个事件需要知道浏览器何时完成调用观察者 目前我是这样做的: // ... do whatever to make the code observe some elements document.scrollingElement.scrollTop = window.inner

我正在尝试编写一个测试,当元素位于视口中时,该测试将断言某些内容

我使用的是API,事实证明,对观察者的调用是在浏览器能够调用它们时完成的

所以问题是,我应该如何对待这种断言? 我应该等一会儿吗?多少毫秒就足够了? 是否有一个事件需要知道浏览器何时完成调用观察者

目前我是这样做的:

// ... do whatever to make the code observe some elements
document.scrollingElement.scrollTop = window.innerHeight;

// Wait for observer to kick in (tried 1, 5, millis, 10 seems to work)
await new Promise(resolve => setTimeout(resolve, 10));

sinon.assert.calledWith(spy, dom.querySelector(selector));
这是可行的,但我想知道是否还有比等待一段时间更好的事情。

好问题, 您应该尝试使用
requestAnimationFrame
,但要使用两次

例如:

await new Promise(resolve => requestAnimationFrame(requestAnimationFrame(resolve))) 

令人惊叹的!成功了!但是它实际上是在等待新的承诺(resolve=>requestAnimationFrame(()=>requestAnimationFrame(resolve))(第一次调用中的箭头函数)