我正在尝试使用GAE J8标准环境(无可扩展环境)的servlet 3.1中的异步处理支持.
基本上我有一个带有注释的servlet
@WebServlet(name = "MyServletName", urlPatterns = {"/dosomething"}, asyncSupported = true)
并获取AsyncContext的实例我调用(在doPost方法中)
final AsyncContext asyncContext = httpServletRequest.startAsync(httpServletRequest, httpServletResponse);
但异步处理支持似乎在GAE中存在一些问题
本地开发服务器说:
[INFO] GCLOUD: java.lang.IllegalStateException: !asyncSupported: _ah_DevAppServerModulesFilter
[INFO] GCLOUD: at org.eclipse.jetty.server.Request.startAsync(Request.java:2262)
[INFO] GCLOUD: at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:464)
[INFO] GCLOUD: at <my-servlet>.doPost
[INFO] GCLOUD: at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
[INFO] GCLOUD: at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
[INFO] GCLOUD: at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
[INFO] GCLOUD: at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1772)
[INFO] GCLOUD: at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
[INFO] GCLOUD: at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
[INFO] GCLOUD: at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:134)
[INFO] GCLOUD: at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
[INFO] GCLOUD: at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
[INFO] GCLOUD: at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
[INFO] …Run Code Online (Sandbox Code Playgroud) 我正在开发App Maker应用程序,并从客户端脚本中调用服务器端函数(假设函数a和函数b),它们相互依赖。
客户端脚本中的第一个(本机)解决方案如下,该解决方案使用回调:
function doB(s) {
google.script.run.withSuccessHandler(function(result) { // async workload
console.log(result);
}).withFailureHandler(function(error) {
console.log(error);
}).b(s);
}
function aThenB(s) {
google.script.run.withSuccessHandler(function(result) { // async workload
console.log(result);
doB(result); // call b
}).withFailureHandler(function(error) {
console.log(error);
}).a(s);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您必须先调用function c,然后再调用d等等,并获得这些相关函数的执行结果,这将变得非常笨拙。我阅读了这篇文章,其中描述了从回调到Promise的转换,例如:
function runnerToPromise(f) {
var runArgs = Array.prototype.slice.call(arguments).slice(1);
return new Promise(function(resolve, reject) { // executor
google.script.run.withSuccessHandler(function(result) {
resolve(result); // resolve promise
}).withFailureHandler(function(error) {
reject(error); // reject promise
})[f].apply(this, runArgs); // async
});
} …Run Code Online (Sandbox Code Playgroud)