javascript - settimeout 并等待(如果已设置超时)

标签 javascript queue settimeout

如何为settimeout函数创建队列。

我想创建带有 settimeout 的函数以在 2 秒后打印控制台,但如果相同的 settimeout 已经在等待执行,则应在完成第一个函数后执行新的超时函数

<script>
function print_console(text,time)
{
   if(timeout is not already set)
   {
      timeout=setTimeout(function(){console.log(text);},time);
   }
   else
   {
     time=addition of time of already setted timeout + argument time
     timeout=setTimeout(function(){console.log(text);},time);
   }
}
print_console('i will print in 1000 minisec',1000);
print_console('i will print in 3000 minisec',2000);
print_console('i will print in 6500 minisec',3500);
.................
.............
</script>

我期望此函数在控制台输出屏幕上输出--

我将在 1000 微秒内打印 --- 07/08/2019 04:01:01

我将在 3000 微秒内打印 --- 07/08/2019 04:01:03

我将在 6500 微秒内打印 --- 07/08/2019 04:01:06

最佳答案

您可以为此使用async/await:

(async () => { 
  async function print_console(text,time) {
    await new Promise((res, rej) => {
      setTimeout(() => (console.log(text), res()), time);
    });
  }

  await print_console('i will print in 1000 minisec',1000);
  await print_console('i will print in 3000 minisec',2000);
  await print_console('i will print in 6500 minisec',3500);
})();


编辑:OP想要在此范围之外调用它。然后我会使用另一种方法,使用 IFEE 将数组、标志 var 和函数调用者存储到函数作用域中:

const print_console = (() => {
  const arr = [];
  let isProcessing = false;
  
  setInterval(() => {
    if(isProcessing) return;
    
    const next = arr.shift();
    if(next) {
      isProcessing = true;
      setTimeout(() => {
        console.log(next.text);
        isProcessing = false;
      }, next.time);
    }
  });
  
  return (text, time) => {
      arr.push({text, time});
  } 
})();


print_console('i will print in 1000 minisec',1000);
print_console('i will print in 3000 minisec',2000);
print_console('i will print in 6500 minisec',3500);

关于javascript - settimeout 并等待(如果已设置超时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57392420/

相关文章:

data-structures - 堆栈和队列,为什么?

javascript - 无法在此 Node 中添加超时 http get 请求

.net - 通过 .Net 的 Tarantool 队列

javascript - 画廊插件 : How to add links?

javascript - JSON.stringify(array) 用方括号包围

javascript - 任务队列在第 5 步失败 : Playlist could not be load due to crossdomain policy restrictions - Youtube

c# - ConcurrentQueue <T>或Queue <T>当一个线程仅入队而另一个线程仅出队

javascript - setTimeout 几个小时后滑动速度更快

javascript - 使用 Node.JS 可以同时运行的 setTimeout() 方法的最大数量是多少

使用带有 img URL 的数组的 Javascript 幻灯片