我是同时学习JavaScript和Google Apps脚本的Java开发人员。作为新手,我学习了JavaScript的语法,而不是它实际上是如何工作的,我高兴地入侵了Google Apps脚本,并像Java一样顺序地和同步地编写了代码。我所有的代码都与此类似:(大体简化以显示我的意思)
function doStuff() {
var url = 'https://myCompany/api/query?term<term&search';
var json = getJsonFromAPI(url);
Logger.log(json);
}
function getJsonFromAPI(url) {
var response = UrlFetchApp.fetch(url);
var json = JSON.parse(response);
return json;
}
而且有效!一切正常!如果我不继续学习JavaScript,我会说它像发条一样工作。但是JavaScript并不是一个发条,它是异步的,从我的理解来看,它根本不起作用,它将“编译”,但是记录json
变量应该记录未定义,但是它记录JSON没问题。
NOTE:
该代码是在Google表格的脚本编辑器中编写和执行的。
这是为什么?
虽然Google Apps脚本implements a subset of ECMAScript 5,没有强制它异步的内容。
虽然JavaScript的主要功能确实是异步特性,但Google开发人员似乎已经放弃了它,转而使用了更简单,更直接的API。
UrlFetchApp
方法是同步的。它们返回HttpResponse
对象,并且不进行回调。显然,这是API的决定。
请注意,自introduction of V8 runtime for google app scripts以来,这并没有真正改变。
运行Promise.all(func1, func2)
,我可以看到第二个函数中的代码要等到第一个函数完成才执行。
此外,没有still没有用于分支执行顺序的setTimeout()
全局函数。任何API都不提供回调函数或类似Promise的结果。似乎GAS的现行理念是使所有内容同步。