gpt4 book ai didi

javascript - 从 Jupyter Comm 设置全局变量

转载 作者:行者123 更新时间:2023-12-03 02:07:05 25 4
gpt4 key购买 nike

我正在尝试从 Jupyter 笔记本中的 javascript 中的 python 单元访问数据。我正在使用 Jupyter 的 Comm 功能。以下 HTML 单元设置为提供 d3js 以及 <div> d3 可以选择。

%%HTML
<div class="anchor"></div>
<script>
requirejs.config({
paths: {
d3: 'https://d3js.org/d3.v5'
}
});

require(['d3'], function(d3) {
window.d3 = d3;
});
</script>

接下来我运行一个 python 单元来发送通信数据。

def target_func(comm, msg):
comm.send({'abc': 123})

get_ipython().kernel.comm_manager.register_target('data', target_func)

最后,我运行一个 javascript 单元来显示上面 python 单元中的数据。我也登录到控制台,以确保数据确实存在(确实如此)。

%%javascript
var comm = Jupyter.notebook.kernel.comm_manager.new_comm('data');
var temp
comm.on_msg(function(msg) {
console.log(msg.content.data);
temp = msg
});

d3.select(".anchor").append("span").text(temp);

问题:我无法从函数范围之外的通信消息中获取数据。在上面的示例中,当 d3 将文本附加到范围时,该变量 temp未定义。

如何从该函数范围之外的通信消息中获取数据?

最佳答案

如果你打电话 d3.select(".anchor").append("span").text(temp); 会怎么样? on_msg 内回调?

例如:

%%javascript
var comm = Jupyter.notebook.kernel.comm_manager.new_comm('data');
var temp
comm.on_msg(function(msg) {
console.log(msg.content.data);
temp = msg
d3.select(".anchor").append("span").text(temp);
});

我认为你的错误是你在定义附加 on_msg 之后立即调用 d3 东西。打回来。定义和附加该回调的行为不会使其立即运行。它仅在从内核接收到消息并且 JavaScript 运行时恰好可以自由运行它时运行。

所以真正发生的事情是,您定义并附加了回调,然后执行 d3 内容,然后 JavaScript 引擎完成了对该 block 的评估。只有在完成对 block 的评估之后,引擎才可以自由地接受来自内核的消息并触发回调,到那时已经太晚了,因为您已经调用了 d3 东西。

关于javascript - 从 Jupyter Comm 设置全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49757004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com