Javascript Sleep()未按预期工作
在我的代码中,我试图在继续代码的其余部分之前设置一定的延迟。非常基本。我使用的是自定义睡眠函数,因为javascript的本机睡眠函数根本不起作用。我实际上在谷歌电子表格的应用程序脚本中工作,所以也许这就是原因。但以下代码位于电子表格应用程序脚本中html文件的Javascript Sleep()未按预期工作,javascript,google-apps-script,return,delay,sleep,Javascript,Google Apps Script,Return,Delay,Sleep,在我的代码中,我试图在继续代码的其余部分之前设置一定的延迟。非常基本。我使用的是自定义睡眠函数,因为javascript的本机睡眠函数根本不起作用。我实际上在谷歌电子表格的应用程序脚本中工作,所以也许这就是原因。但以下代码位于电子表格应用程序脚本中html文件的标记中 无论如何,当我使用sleep()时,它是在setTimeout function get_ids(db){ window.alert("before window.ids is saved?"); google.
标记中
无论如何,当我使用sleep()
时,它是在setTimeout
function get_ids(db){
window.alert("before window.ids is saved?");
google.script.run.withSuccessHandler(getIdsFromAppscript).getIdsFromModel(db);
//this returns a result to getIdsFromAppscript but the following code doesn't wait
//for the result to be returned so I want to use sleep before the ids
//variable is returned by get_ids
setTimeout(function(){
window.alert("checking if ids is saved after 10s?");
window.alert("In timeout ids="+window.ids);
var ids= window.ids; //is non empty
},10000);
sleep(10000);
var ids= window.ids;
window.alert("after wait");
window.alert("after sleep ids="+ids); //is empty but should be non empty
return ids; //=window.ids , Need to return a non-empty result
}
function getIdsFromAppscript(result){
window.ids=result;
}
睡眠功能:
function sleep(ms) {
var start = new Date().getTime(), expire = start + ms;
while (new Date().getTime() < expire) { }
return;
}
但是,我的期望输出顺序是:
1) before window is saved?
2) checking if ids is saved after 10s?
3) In timeout ids= [.....] //non empty list
4) after sleep
5) after sleep ids= [...] //should be a non empty list
我之所以编写setTimeout,是为了显示10秒后,结果存储在window.ids
中。然而,即使在我睡眠10秒,甚至30秒后,我也无法从window.ids获得结果
我到底做错了什么?提前感谢~Java脚本,特别是通过V8引擎不睡眠。休眠会导致JavaScript运行的整个线程停止,从而破坏整个异步点
setTimeout()
只等待运行您推入的函数,等待您也放入该函数的时间。它不会停止其余的处决,不管先发生什么,都会先发生
如果事情按顺序发生对你很重要,那么你需要使用回调或承诺
代码中的一个示例可以是:
function doTimeout(ms) {
setTimeout(function(){
window.alert("checking if ids is saved after 10s?");
window.alert("In timeout ids="+window.ids);
var ids= window.ids; //is non empty
},ms);
}
function sleep(ms, callback) {
var start = new Date().getTime(), expire = start + ms;
while (new Date().getTime() < expire) { }
callback(ms);
}
sleep(10000, doTimeout);
函数doTimeout(毫秒){
setTimeout(函数(){
警告(“检查ID是否在10秒后保存?”);
window.alert(“超时ID=“+window.ids”);
var ids=window.ids;//为非空
},ms);
}
函数睡眠(ms、回调){
var start=new Date().getTime(),expire=start+ms;
while(new Date().getTime()
Java脚本,特别是通过V8引擎不睡眠。休眠会导致JavaScript运行的整个线程停止,从而破坏整个异步点setTimeout()
只等待运行您推入的函数,等待您也放入该函数的时间。它不会停止其余的处决,不管先发生什么,都会先发生
如果事情按顺序发生对你很重要,那么你需要使用回调或承诺
代码中的一个示例可以是:
function doTimeout(ms) {
setTimeout(function(){
window.alert("checking if ids is saved after 10s?");
window.alert("In timeout ids="+window.ids);
var ids= window.ids; //is non empty
},ms);
}
function sleep(ms, callback) {
var start = new Date().getTime(), expire = start + ms;
while (new Date().getTime() < expire) { }
callback(ms);
}
sleep(10000, doTimeout);
函数doTimeout(毫秒){
setTimeout(函数(){
警告(“检查ID是否在10秒后保存?”);
window.alert(“超时ID=“+window.ids”);
var ids=window.ids;//为非空
},ms);
}
函数睡眠(ms、回调){
var start=new Date().getTime(),expire=start+ms;
while(new Date().getTime()
我在下面列出了两个示例,说明您的sleep函数阻塞了整个Javascript引擎。当我使用您的sleep
功能时,即使我设置了100 ms的间隔并且输出延迟了10秒,间隔功能也不会执行。但是,在第二个示例中,输出会以正确的间隔立即打印。这表明sleep
函数正在阻塞整个执行引擎,这解释了ids
数组为空的原因
功能睡眠(毫秒){
var start=new Date().getTime(),
过期=开始+毫秒;
while(new Date().getTime()”;
var计数器=0;
setInterval(函数(){
同时(计数器<100){
文档。写入(“检查ID是否在10秒后保存?”+“
”;
计数器=计数器+1
}
}, 100);
睡眠(10000);
文件写入(“等待后”);
}
文件。写入(“开始”);
获取_id()
文件。填写(“结束”)代码>我在下面列出了两个示例,说明您的sleep函数阻塞了整个Javascript引擎。当我使用您的sleep
功能时,即使我设置了100 ms的间隔并且输出延迟了10秒,间隔功能也不会执行。但是,在第二个示例中,输出会以正确的间隔立即打印。这表明sleep
函数正在阻塞整个执行引擎,这解释了ids
数组为空的原因
功能睡眠(毫秒){
var start=new Date().getTime(),
过期=开始+毫秒;
while(new Date().getTime()”;
var计数器=0;
setInterval(函数(){
同时(计数器<100){
文档。写入(“检查ID是否在10秒后保存?”+“
”;
计数器=计数器+1
}
}, 100);
睡眠(10000);
文件写入(“等待后”);
}
文件。写入(“开始”);
获取_id()
文件。填写(“结束”)代码>Javascript是单线程的。您必须从代码返回,以便在其他线程中执行脚本。其他线程中的脚本包括处理超时事件的函数、在承诺保持或失败时调用的函数,以及为使用对象发出的异步请求提供的回调函数
编写函数并调用它sleep()
不会改变这一点。你可以把它称为waitingForGodot()
,因为它会带来很多不同。您提供的代码所做的是花费大量时间在调用它的线程中循环。它不会放弃控制并阻止所有其他脚本的执行。如果它持续足够长的时间,我的浏览器将询问我是否希望中止(如您的)脚本。Javascript是单线程的。您必须从代码返回,以便在其他线程中执行脚本。其他线程中的脚本包括处理超时事件的函数、在承诺保持或失败时调用的函数,以及为使用对象发出的异步请求提供的回调函数
编写函数和c