diff --git a/packages/g6/__tests__/demo/static/controller-viewport.ts b/packages/g6/__tests__/demo/static/controller-viewport.ts
index 9f44fbfe799..006e07767a9 100644
--- a/packages/g6/__tests__/demo/static/controller-viewport.ts
+++ b/packages/g6/__tests__/demo/static/controller-viewport.ts
@@ -43,26 +43,35 @@ export const controllerViewport: StaticTestCase = async (context) => {
assert(viewportController.getViewportCenter()).toCloseTo([250, 250]);
// 起始中心坐标 [250, 250]
- const effectTiming = undefined; // { duration: 500 };
-
- await viewportController.translate({ mode: 'absolute', value: [25, 25] }, effectTiming); // 当前坐标 [275, 275]
+ viewportController.translate({ mode: 'absolute', value: [25, 25] }); // 当前坐标 [275, 275]
assert(viewportController.getViewportCenter()).toCloseTo([275, 275]);
- await viewportController.translate({ mode: 'relative', value: [25, 25] }, effectTiming); // 当前坐标 [300, 300]
+ viewportController.translate({ mode: 'relative', value: [25, 25] }); // 当前坐标 [300, 300]
assert(viewportController.getViewportCenter()).toCloseTo([300, 300]);
- await viewportController.rotate({ mode: 'absolute', value: 45, origin: [300, 300] }, effectTiming); // 沿 [300, 300] 旋转 45 度,当前坐标 [300, 300]
+ viewportController.rotate({ mode: 'absolute', value: 45, origin: [300, 300] }); // 沿 [300, 300] 旋转 45 度,当前坐标 [300, 300]
- await viewportController.rotate({ mode: 'relative', value: 45 }, effectTiming); // 沿 [250, 250] 旋转 45 度,当前坐标 [250 + 50 * 2**0.5, 250]
+ viewportController.rotate({ mode: 'relative', value: 45 }); // 沿 [250, 250] 旋转 45 度,当前坐标 [250 + 50 * 2**0.5, 250]
assert(viewportController.getViewportCenter()).toCloseTo([250 + 50 * 2 ** 0.5, 250]);
// 以当前坐标系为基准,缩放比例为 1.2,缩放中心点为 [250 + 50 * 2**0.5, 250]
- await viewportController.zoom({ mode: 'absolute', value: 1.2, origin: [250 + 50 * 2 ** 0.5, 250] }, effectTiming);
+ viewportController.zoom({ mode: 'absolute', value: 1.2, origin: [250 + 50 * 2 ** 0.5, 250] });
// 继续沿当前点缩放 1.2 倍
- await viewportController.zoom({ mode: 'relative', value: 1.2, origin: [250 + 50 * 2 ** 0.5, 250] }, effectTiming);
+ viewportController.zoom({ mode: 'relative', value: 1.2, origin: [250 + 50 * 2 ** 0.5, 250] });
// 此时边长度为:100 * 1.2 * 1.2 = 144,坐标为 [250 + 50 * 2**0.5, 250]
- assert(viewportController.getZoom()).toBe(1.44);
+ assert(viewportController.getZoom()).toCloseTo(1.44);
+
+ const effectTiming = { duration: 500 };
+
+ await viewportController.zoom({ mode: 'absolute', value: 1, origin: [250 + 50 * 2 ** 0.5, 250] }, effectTiming);
+
+ assert(viewportController.getZoom()).toCloseTo(1);
+
+ await viewportController.rotate({ mode: 'absolute', value: 0, origin: [250 + 50 * 2 ** 0.5, 250] }, effectTiming);
+
+ await viewportController.translate({ mode: 'absolute', value: [0, 0] }, effectTiming);
+ assert(viewportController.getViewportCenter()).toCloseTo([250, 250]);
};
diff --git a/packages/g6/__tests__/integration/snapshots/static/controller-viewport.svg b/packages/g6/__tests__/integration/snapshots/static/controller-viewport.svg
index 5cf36f9b88e..f4dc33fc365 100644
--- a/packages/g6/__tests__/integration/snapshots/static/controller-viewport.svg
+++ b/packages/g6/__tests__/integration/snapshots/static/controller-viewport.svg
@@ -7,10 +7,7 @@
tabindex="1"
>
-
+
((resolve) => {
- resolveWhenTimeout(resolve, effectTiming.duration);
+ const onfinish = () => {
+ this.context.graph.emit(GraphEvent.AFTER_VIEWPORT_ANIMATION, options);
+ resolve();
+ };
+ resolveWhenTimeout(onfinish, effectTiming.duration);
this.camera.gotoLandmark(
this.createLandmark(
@@ -97,13 +101,7 @@ export class ViewportController {
focalPoint: [ox - x, oy - y, z ?? fz - z],
},
),
- {
- ...effectTiming,
- onfinish: () => {
- this.context.graph.emit(GraphEvent.AFTER_VIEWPORT_ANIMATION, options);
- resolve();
- },
- },
+ { ...effectTiming, onfinish },
);
});
} else {
@@ -121,17 +119,15 @@ export class ViewportController {
this.context.graph.emit(GraphEvent.BEFORE_VIEWPORT_ANIMATION, options);
return new Promise((resolve) => {
- resolveWhenTimeout(resolve, effectTiming.duration);
+ const onfinish = () => {
+ this.context.graph.emit(GraphEvent.AFTER_VIEWPORT_ANIMATION, options);
+ resolve();
+ };
+ resolveWhenTimeout(onfinish, effectTiming.duration);
this.camera.gotoLandmark(
this.createLandmark({ roll: mode === 'relative' ? camera.getRoll() + angle : angle }),
- {
- ...effectTiming,
- onfinish: () => {
- this.context.graph.emit(GraphEvent.AFTER_VIEWPORT_ANIMATION, options);
- resolve();
- },
- },
+ { ...effectTiming, onfinish },
);
});
} else {
@@ -157,14 +153,13 @@ export class ViewportController {
this.context.graph.emit(GraphEvent.BEFORE_VIEWPORT_ANIMATION, options);
return new Promise((resolve) => {
- resolveWhenTimeout(resolve, effectTiming.duration);
- this.camera.gotoLandmark(this.createLandmark({ zoom: targetRatio }), {
- ...effectTiming,
- onfinish: () => {
- this.context.graph.emit(GraphEvent.AFTER_VIEWPORT_ANIMATION, options);
- resolve();
- },
- });
+ const onfinish = () => {
+ this.context.graph.emit(GraphEvent.AFTER_VIEWPORT_ANIMATION, options);
+ resolve();
+ };
+ resolveWhenTimeout(onfinish, effectTiming.duration);
+
+ this.camera.gotoLandmark(this.createLandmark({ zoom: targetRatio }), { ...effectTiming, onfinish });
});
} else {
camera.setZoomByViewportPoint(targetRatio, [origin[0], origin[1]]);