JavaScript如何通过Promise获取指定变量值 解决statelist未定义报错
问题说明
使用Python库streamlit_javascript运行Promise代码,尝试获取前端JS中定义的statelist变量值时,运行抛出statelist not defined错误。
- 当前编写的响应处理代码:
return_value = st_javascript("""await fetch("http://localhost:8501").then(function(response){ console.log("Success!", response); return response.json($statelist); });""")
- 待获取的目标变量前端定义代码:
var statelist = new Set() statelist.add('Kansas')
报错原因
- 对
fetch和response.json()的用法理解错误:response.json()是用来把fetch拿到的HTTP响应体解析为JSON对象的内置方法,不接受传入自定义变量作为参数,本身也没有读取目标页面JS运行时变量的能力。 - 取值逻辑走偏:
fetch请求只能拿到目标地址返回的静态文本内容(比如HTML源码、接口返回的JSON数据),不会自动执行返回内容里的JS代码,自然不可能访问到页面运行时才生成的statelist变量。另外代码里写的$statelist属于无意义语法,JS原生没有这种变量引用写法。
正确修复方式
如果statelist和你执行st_javascript的环境属于同一个前端全局上下文,根本不需要发fetch请求,直接读取变量返回即可;注意Set类型无法直接做跨语言序列化,要先转成普通数组:
return_value = st_javascript(""" // 直接读取同上下文的全局变量,Set转数组保证Python端能正常接收 return Array.from(statelist); """)
如果statelist是定义在独立的目标页面运行时里,普通fetch请求根本拿不到这个值,你需要要么在目标页面把statelist的值写到可被接口返回的位置,要么通过同源iframe通信的方式传递值——fetch本身只能拿静态响应内容,不可能触达页面JS的运行时内存。
内容的提问来源于stack exchange,提问作者Eshwar Bychanahalli
相关产品推荐
相关产品推荐

