基于 Jens 的方法,您可以使用 CacheService 作为您的数据代理,而不是外部服务。我解决这个问题的方法是让我的“服务器”应用程序生成一个临时缓存键,并将其返回给“客户端”应用程序的成功回调。然后,客户端应用程序会定期轮询此缓存键,以查看服务器应用程序是否已将结果返回到缓存中。
服务器应用程序返回一个临时缓存键,并包含一些帮助函数以简化在客户端的检查:
function someAsynchronousOperation() {
var interimCacheKey = createInterimCacheKey();
doSomethingComplicated(function(result) {
setCacheKey(interimCacheKey, result);
});
return interimCacheKey;
}
function createInterimCacheKey() {
return Utilities.getUuid();
}
function getCacheKey(cacheKey, returnEmpty) {
var cache = CacheService.getUserCache();
var result = cache.get(cacheKey);
if(result !== null || returnEmpty) {
return result;
}
}
function setCacheKey(cacheKey, value) {
var cache = CacheService.getUserCache();
return cache.put(cacheKey, value);
}
请注意,默认情况下 getCacheKey 不会返回。这是为了让 google.script.run 的 successHandler 在缓存条目返回非 null 之前不会被调用。
在客户端应用程序(我在其中使用 Angular)中,您调用服务器中的异步操作,并等待其结果:
google.script.run.withSuccessHandler(function(interimCacheKey) {
var interimCacheCheck = $interval(function() {
google.script.run.withSuccessHandler(function(result) {
$interval.cancel(interimCacheCheck);
handleSomeAsynchronousOperation(result);
}).getCacheKey(interimCacheKey, false);
}, 1000, 600); // Check result once per second for 10 minutes
}).someAsynchronousOperation();
使用这种方法您还可以报告进度,并且只有在进度达到 100% 后才取消您的检查。在这种情况下,您需要消除间隔到期。