如何将Apps Script HTML中fetch().then()转换为google.script.run并等待返回?
解决Google Apps Script中google.script.run的异步等待问题
你说得没错,google.script.run是基于回调而非Promise设计的,所以直接像fetch那样接.then()肯定行不通。核心思路就是把它包装成Promise,这样就能沿用你熟悉的异步链式调用或者async/await写法了。
第一步:封装通用的Promise版google.script.run函数
先写一个通用函数,把任意服务器端函数调用转换成Promise:
// 封装google.script.run为Promise function runServerFunction(funcName, params) { return new Promise((resolve, reject) => { google.script.run .withSuccessHandler(resolve) // 成功时把结果传给Promise的resolve .withFailureHandler(reject) // 失败时把错误传给Promise的reject [funcName](params); // 动态调用指定的服务器端函数 }); }
这个函数的作用是:
- 接收服务器端函数名和参数
- 返回一个Promise对象,成功时触发
resolve,失败时触发reject - 自动绑定
google.script.run的成功/失败回调,省去重复写的麻烦
第二步:改写你的innerNameOne函数
现在就可以用这个封装好的函数替代原来的fetch调用,完美适配.then()链式写法:
window.some_Object_Name = { innerNameOne: function() { // 调用封装后的Promise函数 return runServerFunction('myServerAppsScriptFnc', { method: 'post' }) .then(response_Back_From_Request => { // 这里处理服务器返回的结果,和你原来用fetch的逻辑完全一致 console.log('服务器返回结果:', response_Back_From_Request); return response_Back_From_Request; }) .catch(error => { // 别忘了处理错误情况,避免静默失败 console.error('服务器调用失败:', error); throw error; // 可以选择抛出错误让上层调用者处理 }); } };
更简洁的async/await写法
如果你习惯用async/await,代码会更直观:
window.some_Object_Name = { innerNameOne: async function() { try { const response_Back_From_Request = await runServerFunction('myServerAppsScriptFnc', { method: 'post' }); console.log('服务器返回结果:', response_Back_From_Request); return response_Back_From_Request; } catch (error) { console.error('服务器调用失败:', error); throw error; } } };
为什么你原来的写法不生效?
你之前尝试直接在google.script.run链式调用后加.then(),是因为google.script.run的方法链返回的不是Promise对象,而是它自身的实例,所以没有.then()方法。必须通过Promise包装,把回调模式转换成Promise模式,才能使用链式调用。
内容的提问来源于stack exchange,提问作者Alan Wells
相关产品推荐
相关产品推荐

