JavaScript中async函数外无法获取内部赋值变量的问题排查
问题根因
你的推测方向正确,但代码里还存在一个作用域bug,两个问题共同导致外部无法拿到正确的值:
- 异步时序问题:
async函数调用后不会阻塞后续同步代码执行,你在if块中调用resizeImage()时,只是启动了图片处理的异步任务,后面的alert会立刻同步执行,此时图片处理流程还未跑完,变量自然还没完成赋值。 - 变量作用域错误:你在
resizeImage函数内部写了var resizedImageToUpload = manipResultPARSED.uri;,这里用var重新声明了一个和外部全局变量同名的函数局部变量,就算异步操作执行完成,修改的也只是函数内部的局部变量,外部声明的全局resizedImageToUpload永远不会被更新。
额外提示:你代码中先对manipResult做JSON序列化再反序列化的操作完全多余,manipResult本身就是可直接访问属性的JS对象,直接读取.uri即可,不需要额外做格式转换。
修复方法
- 删掉
resizeImage内部resizedImageToUpload前面的var关键字,不要重复声明同名变量,直接给外部的全局变量赋值。 - 等待异步图片处理操作执行完成后,再执行alert逻辑,不要在调用
resizeImage()后立刻同步读取变量值。
修复后的参考代码:
var resizedImageToUpload; const resizeImage = async () => { const manipResult = await manipulateAsync( pickedImagePath, [ { resize: { width: 390 }}, ], { compress: 1, format: SaveFormat.PNG } ); // 去掉var,直接给外部变量赋值 resizedImageToUpload = manipResult.uri; alert("函数内resizedImageToUpload IS: "+resizedImageToUpload); }; if(pickedImagePath != ""){ // 等待异步操作完成后再读取变量执行alert resizeImage().then(() => { alert("if块内resizedImageToUpload IS: "+resizedImageToUpload); }) }
如果你的if块所在的作用域本身就是async环境,也可以直接用await resizeImage()代替.then写法,核心逻辑一致:必须等异步操作执行完成、变量完成赋值后再访问。
内容的提问来源于stack exchange,提问作者gigapico00
相关产品推荐
相关产品推荐

