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

如何用D3.js在单页绘制多图表?Apache Wicket循环渲染异常排查

问题:循环调用D3.js渲染仅生成最后一个图表(Apache Wicket环境)

我需要在单个页面基于不同条件绘制5个图表,当前通过循环调用函数并传入不同数据实现,但D3.js仅在循环结束时触发绘制函数,仅生成最后一个条件对应的图表。我使用的是Apache Wicket框架,相关代码如下:

Scala代码(Apache Wicket中生成JS的方法)

final def rawData(id:String): String = { 
  s"""
     require(["renderer"], function (renderer) {

     renderer.init("#${id}");
     var data = 'digraph g {\\n ${data.attributes.trim} \\n' +
                 ${if (nodes.isEmpty) "''" else nodes} +
                 ${if (links.isEmpty) "''" else links} +
               '}';
     const getData = async() => {
       await renderer.render(data);
     }
     getData();
     });
   """
}

问题说明:
上述函数会调用下方的renderer模块,但每次调用时,renderer的init方法都会被执行并设置数据,render方法也会被调用,但每次都不会进入ready阶段,而是进入pending状态,直到最后一次才触发ready阶段,最终只绘制出最后一个图表。

Renderer模块代码

define('renderer',['stage', "worker!layout-worker.js"], function(stage, worker) {

  var initialized = false, pending, errorCallback, renderCallback;
  var bool =false;
  worker.onmessage = function (event) {

    switch (event.data.type) {
      case "ready":
        initialized = true;
       
        if (pending) {
          worker.postMessage(pending);
        }
        break;
      case "stage":
        stage.draw(event.data.body);
        console.log("stage =================> ",event.data.type);
        renderCallback && renderCallback();
        break;
      case "error":
        if (errorCallback) {
          errorCallback(event.data.body);
        }
    }
  };

  return {
    init: function(element) {
         
      return stage.init(element);
    },
    render: function(source) {
      if (initialized) {
        worker.postMessage(source);
      } else {
        pending = source;
      }
    },
    stage: stage,
    errorHandler: function(handler) {
      errorCallback = handler;
    },
    renderHandler: function(handler) {
      renderCallback = handler;
    }
  };

});

Web Worker代码

require(/*{
    baseUrl: "."
  },*/
  ["transformer"],
  function(transformer) {

    onmessage = function(event) {
      try {
        var result = transformer.generate(event.data);
        postMessage({
          type: "stage",
          body: result
        });
      } catch (e) {
        postMessage({
          type: "error",
          body: e
        });
      }
    };

    postMessage({
      type: "ready"
    });
  }
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:45:34