Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.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
Javascript Sleep()未按预期工作_Javascript_Google Apps Script_Return_Delay_Sleep - Fatal编程技术网

Javascript Sleep()未按预期工作

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.

在我的代码中,我试图在继续代码的其余部分之前设置一定的延迟。非常基本。我使用的是自定义睡眠函数,因为javascript的本机睡眠函数根本不起作用。我实际上在谷歌电子表格的应用程序脚本中工作,所以也许这就是原因。但以下代码位于电子表格应用程序脚本中html文件的
标记中

无论如何,当我使用
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