使用Eel将Python读取的文本数据存入JavaScript变量遇值丢失问题
问题根源
这不是作用域问题,是异步代码执行顺序导致的:
assign()是异步函数,调用它时会立即返回一个Promise,不会阻塞后续代码执行- 你调用
assign()后马上执行printCorrectly(),这时候await eel.ReturnTextString("ps1")()还没完成,newData还是初始的空字符串 - 等异步操作完成后
newData才会被赋值,但这时候printCorrectly()已经执行过了
解决方案
有几种可行的处理方式:
方式1:用await等待assign完成
把顶层代码放到异步立即执行函数里,确保赋值完成后再执行打印:
var newData = ""; async function assign(){ newData = await eel.ReturnTextString("ps1")(); console.log(newData); } function printCorrectly(){ console.log(newData); } // 用异步立即执行函数包裹顶层逻辑 (async function(){ await assign(); printCorrectly(); // 现在会正确打印文本内容 })();
方式2:在异步操作完成后调用printCorrectly
直接在异步任务结束后触发打印逻辑,不需要额外等待:
var newData = ""; async function assign(){ newData = await eel.ReturnTextString("ps1")(); console.log(newData); printCorrectly(); // 异步赋值完成后再调用打印 } function printCorrectly(){ console.log(newData); } assign();
或者用Promise的.then()语法(不用async/await的写法):
var newData = ""; function assign(){ eel.ReturnTextString("ps1")().then(function(data){ newData = data; console.log(newData); printCorrectly(); }); } function printCorrectly(){ console.log(newData); } assign();
方式3:让printCorrectly自行等待异步结果
如果需要多次调用printCorrectly,可以把异步结果用Promise存储,让打印函数自行等待:
// 直接把异步请求的Promise存起来 const newDataPromise = eel.ReturnTextString("ps1")(); async function printCorrectly(){ const data = await newDataPromise; console.log(data); } printCorrectly(); // 直接调用会自动等待结果返回
内容的提问来源于stack exchange,提问作者CaseyBrandenburg
相关产品推荐
相关产品推荐

