You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Cytoscape集合动画完成后回调函数多次触发的问题

问题原因

你为集合批量绑定动画时,库会为集合内的每个独立元素单独创建动画实例,每个实例播放结束都会触发一次complete回调,因此触发次数和集合元素数量一致。


解决方法

方法1:计数器实现(对JS新手最友好)

声明一个计数器记录已经完成动画的元素数量,每次触发回调时计数+1,当计数等于集合总长度时再执行你需要的逻辑:

const total = collection.length;
let completedCount = 0;

collection.animate({
  style: {
    'line-color': 'red',
    'target-arrow-color': 'red',
    'border-width': 20,
    'border-color': 'red'
  }
}, {
  'duration': 3000,
  'complete': () => {
    completedCount++;
    // 所有元素动画都完成时才执行目标逻辑
    if (completedCount === total) {
      console.log("hello world");
      // 此处添加你需要执行的回调逻辑
    }
  }
});

方法2:Promise批量等待(更符合现代JS写法)

把每个元素的动画包装成Promise,再用Promise.all等待所有Promise执行完成后触发回调:

// 为每个元素创建动画Promise
const animationPromises = collection.map(ele => {
  return new Promise(resolve => {
    ele.animate({
      style: {
        'line-color': 'red',
        'target-arrow-color': 'red',
        'border-width': 20,
        'border-color': 'red'
      }
    }, {
      duration: 3000,
      complete: resolve
    });
  });
});

// 所有动画完成后统一执行回调
Promise.all(animationPromises).then(() => {
  console.log("hello world");
  // 此处添加你需要执行的回调逻辑
});

如果你使用的是Cytoscape.js库,还可以直接创建集合的组合动画,更简便地实现单次回调:

const ani = collection.animation({
  style: {
    'line-color': 'red',
    'target-arrow-color': 'red',
    'border-width': 20,
    'border-color': 'red'
  },
  duration: 3000
});
ani.play().promise().then(() => {
  console.log("hello world");
});

内容的提问来源于stack exchange,提问作者user21398

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:24:11