// 不生效
// let handler;
// const bindevent = (viewer, czmlDataSource) => {
// handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
// handler.setInputAction((movement) => {
// const pickedObject = viewer.scene.pick(movement.position);
// if (Cesium.defined(pickedObject) && pickedObject.id) {
// const entity = pickedObject.id;
// viewer.flyTo(entity, {
// duration: 2.0,
// offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-45), 500)
// })
// viewer.trackedEntity = entity;
// }
// }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
// }
// async function loadCzml(viewer, czml) {
// const res = await Cesium.CzmlDataSource.load(czml)
// viewer.clock.shouldAnimate = true;
// viewer.dataSources.add(res);
// bindevent(viewer, res)
// return res
// }
// 生效
// let handler;
// async function loadCzml(viewer, czml) {
// Cesium.CzmlDataSource.load(czml).then(
// (czmlDataSource) => {
// viewer.clock.shouldAnimate = true;
// viewer.dataSources.add(czmlDataSource);
// viewer.flyTo(czmlDataSource)
// handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
// handler.setInputAction((movement) => {
// const pickedObject = viewer.scene.pick(movement.position);
// if (Cesium.defined(pickedObject) && pickedObject.id) {
// const entity = pickedObject.id;
// viewer.flyTo(entity, {
// duration: 2.0,
// offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-45), 500)
// })
// viewer.trackedEntity = entity;
// }
// }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
// return czmlDataSource;
// }).catch((error) => {
// console.error('Error loading CZML or model:', error);
// });
// }
可能原因
异步函数的执行顺序问题
在 async/await 的上下文中,虽然代码看起来是顺序执行的,但它其实是异步的,这意味着当你在 await 之后执行后续代码时,可能某些处理没有被完全同步,尤其是在与像 Cesium 这样的大型库进行交互时。事件绑定的时机问题
Cesium 是一个渲染密集型的框架,加载 CZML 数据可能会导致较多的异步操作(比如数据源添加到 viewer 时可能触发重新计算时间轴或场景渲染),这可能会导致事件绑定的时机出问题。潜在的内部异步行为
即使你 await 了 Cesium.CzmlDataSource.load(czml),Cesium 可能在后台执行更多异步渲染或数据处理任务,导致 bindevent 绑定时,场景还没有完全准备好。差异行为的解释
then 与 await 虽然表现相同,但在某些情况下,then 是回调机制,会保证操作完成后才触发回调,而 await 在某些场景下可能会提前执行后续代码,造成逻辑上的一些不同步现象。
总结:真tm坑