Google Apps Script中await调用google.script.run无法写入全局变量问题
问题成因
async函数的返回值本质是Promise对象,你在$(document).ready的回调中直接调用loadPatientData()时没有加await关键字,JS引擎不会阻塞等待该异步函数执行完毕,会直接往下执行后续的google.script.run.logThis(patientData.names)逻辑。- 此时服务端接口
getPatientData()的请求还在异步传输过程中,全局变量patientData.names还没被赋值,所以打印出来是null。你在loadPatientData内部能正常打印到值,是因为那行日志在await拿到接口返回值之后才执行,和外部的log调用是并行时序,不存在先后执行的保证。 - 你把
google.script.run包装成Promise的写法是正确的,问题核心出在调用async函数时没有等待其执行完成。
修复方案
首先将$(document).ready的回调函数声明为async,调用loadPatientData()时加上await,确保数据赋值完成后再执行后续日志逻辑,修正后的完整代码如下:
let patientData = {}; // 将ready回调改为async函数,支持内部使用await关键字 $(document).ready(async function() { // 加await等待loadPatientData完全执行完成、全局变量赋值完毕 await loadPatientData(); // 此时patientData.names已经完成赋值,不会再返回null google.script.run.logThis(patientData.names); }) async function loadPatientData() { const a = await new Promise(r => { google.script.run.withSuccessHandler(r).getPatientData(); }); patientData.names = a; }
可选优化
如果不想依赖全局变量传值,可以直接让loadPatientData返回拿到的患者数据,调用时直接接收返回值使用,减少全局变量污染,写法参考:
$(document).ready(async function() { const patientData = await loadPatientData(); google.script.run.logThis(patientData.names); }) async function loadPatientData() { const names = await new Promise(r => { google.script.run.withSuccessHandler(r).getPatientData(); }); // 直接返回组装好的数据,不需要操作全局变量 return { names }; }
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

