一踩一个坑

// 不生效

// 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);
//         });
// }

可能原因

  1. 异步函数的执行顺序问题
    在 async/await 的上下文中,虽然代码看起来是顺序执行的,但它其实是异步的,这意味着当你在 await 之后执行后续代码时,可能某些处理没有被完全同步,尤其是在与像 Cesium 这样的大型库进行交互时。

  2. 事件绑定的时机问题
    Cesium 是一个渲染密集型的框架,加载 CZML 数据可能会导致较多的异步操作(比如数据源添加到 viewer 时可能触发重新计算时间轴或场景渲染),这可能会导致事件绑定的时机出问题。

  3. 潜在的内部异步行为
    即使你 await 了 Cesium.CzmlDataSource.load(czml),Cesium 可能在后台执行更多异步渲染或数据处理任务,导致 bindevent 绑定时,场景还没有完全准备好。

  4. 差异行为的解释
    then 与 await 虽然表现相同,但在某些情况下,then 是回调机制,会保证操作完成后才触发回调,而 await 在某些场景下可能会提前执行后续代码,造成逻辑上的一些不同步现象。

总结:真tm坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值