Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous Google应用程序脚本web应用程序未按预期异步运行_Asynchronous_Google Apps Script_Web Applications_Locking - Fatal编程技术网

Asynchronous Google应用程序脚本web应用程序未按预期异步运行

Asynchronous Google应用程序脚本web应用程序未按预期异步运行,asynchronous,google-apps-script,web-applications,locking,Asynchronous,Google Apps Script,Web Applications,Locking,我有一个非阻塞(即无锁服务)web应用程序,它返回存储在ScriptProperties中的计数器 我在脚本中有一个人工睡眠来测试对web应用程序的异步调用 看看下面的代码,我假设连续两次调用web应用程序都会返回相同的号码 然而,事实并非如此。两次调用web应用程序,一次接一次,返回越来越多的数字。这让我觉得第一个电话在第二个电话运行之前就结束了——这是没有意义的 function doGet(e) { // get script properties var scriptPr

我有一个非阻塞(即无锁服务)web应用程序,它返回存储在ScriptProperties中的计数器

我在脚本中有一个人工睡眠来测试对web应用程序的异步调用

看看下面的代码,我假设连续两次调用web应用程序都会返回相同的号码

然而,事实并非如此。两次调用web应用程序,一次接一次,返回越来越多的数字。这让我觉得第一个电话在第二个电话运行之前就结束了——这是没有意义的

function doGet(e)
{
    // get script properties
    var scriptProperties = PropertiesService.getScriptProperties();
    
    // get ID
    var id = parseInt(scriptProperties.getProperty("id"));

    // fake a long process
    // enough time to make another call to the web-app
    // in theory, the second call will get the same value for `id`
    Utilities.sleep(5000);

    // write a new value
    scriptProperties.setProperty("id", id + 1);
    
    // return it
    return ContentService.createTextOutput(id);
}
我正试图弄明白怎么做/为什么。Google不支持对web应用程序的异步调用吗

你可以看到它在运行

**更新**

这里是我用来测试的本地HTML文件


函数doIt()
{
log(“doIt:start”);
设置超时(callIt,500);
log(“doIt:end”);
}
函数callIt()
{
日志(“callIt:start”);
var request=new XMLHttpRequest();
request.open('GET','https://script.google.com/macros/s/AKfycbxP6TQeMv_4b1lsYvGLA3YAn_reBhZ64Y2d04DotQ4CFJQtKhM/exec",对),;
request.onload=函数()
{
如果(this.status>=200&&this.status<400)
{
document.querySelector(“#output”).innerText+=this.response+”,“;
}
其他的
{
警报(“错误”);
}
};
request.onerror=函数()
{
警报(“错误”);
};
request.send();
控制台日志(“callIt:end”);
}
输出:

是!像
doPost()
这样的Web应用程序调用异步运行

问题: 无法复制冲突的原因是,相对于浏览器进行http调用所用的时间,您的
睡眠时间
太少

解决方案:
  • 将睡眠时间增加到1分钟或以上

    Utilities.sleep(1*60*1000);
    
  • 如果您在下面的代码段脚本中使用随机睡眠时间,您还可以轻松地证明异步性,该脚本将显示每个循环的时间以及随机的“callIt end”

/**/console.config({maximize:true,timeStamps:false,autoScroll:true})/**/
函数callIt(一){
常量标签='callIt'+i;
日志(标签+‘开始’);
控制台。时间(标签);
const request=new XMLHttpRequest();
请求打开(
“得到”,
'https://script.google.com/macros/s/AKfycbxP6TQeMv_4b1lsYvGLA3YAn_reBhZ64Y2d04DotQ4CFJQtKhM/exec',
符合事实的
);
request.onload=函数(){
如果(this.status>=200&&this.status<400){
log(this.response+`-${label}`);
console.log(标签+end');
控制台。时间结束(标签);
console.log('\n')
}否则{
警报(“错误”);
}
};
request.onerror=函数(){
警报(“错误”);
};
request.send();
}
设i=0;
而(++i<10)callIt(i)

您能否提供脚本和/或请求Web应用程序的方法?因为当使用
UrlFetchApp.fetchAll([{url:url},{url:url}])
的脚本时,返回了两个相同的值。我只是很快地在两个选项卡中打开了。我甚至在我的电脑上尝试了一个本地HTML文件。我会更新问题的答案。谢谢你的回答。在
中,Google不支持对web应用程序的异步调用吗?
在您的问题和附加脚本中,我认为您的问题可能有两个问题。那么首先,关于
谷歌不支持对web应用程序的异步调用吗?
在你的问题中,我们来确认一下这一点怎么样?为了检查它,作为简单的脚本,您可以使用googleapps脚本
UrlFetchApp.fetchAll([{url:url},{url:url}]).forEach(e=>console.log(e.getContentText())。作为下一步,将考虑您的脚本。这个怎么样?
Utilities.sleep(Math.floor(Math.random()*60000)+1);