Javascript 有没有一种方法可以在不使用wait关键字的情况下调用sleep()?

Javascript 有没有一种方法可以在不使用wait关键字的情况下调用sleep()?,javascript,node.js,asynchronous,async-await,Javascript,Node.js,Asynchronous,Async Await,我想调用sleep()函数,但前面没有wait关键字。为了实现这一点,我尝试使用另一个带有回调的包装器异步函数sleepsync(x,callback),但没有成功 这是我的密码- function color() { let string1 = "yellow yeelow"; console.log(string1); let string2 = "blu glu"; console.log(string2); let string3 = "green freen";

我想调用
sleep()
函数,但前面没有
wait
关键字。为了实现这一点,我尝试使用另一个带有回调的包装器异步函数
sleepsync(x,callback)
,但没有成功

这是我的密码-

function color() {
  let string1 = "yellow yeelow";
  console.log(string1);
  let string2 = "blu glu";
  console.log(string2);
  let string3 = "green freen";
  console.log(string3);
}

async function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms * 1000));
}

现在,函数调用可以正常工作-

async function fcall(loop = 2) {
  for (let x = loop; x > 0; x--) {
    color();
    await sleep(2);
  }
}

fcall(4);
在上面的调用方式中,每个迭代在继续之前等待2秒

下面的代码是
sleep()
不等待2秒的地方-

async function sleepAsync(x, callback) {
    callback();
    await sleep(x);
  }

  function gcall(loop = 2) {
    for (let x = loop; x > 0; x--) {
      sleepAsync(2, color);
    }
  }

  gcall(4);


这里可以做什么?我哪里出错了?

您可以尝试npm的
sleep
软件包,请参见。

如果后面的代码没有等待,异步函数将无法在准确的时间工作

当代码开始运行时,每个语句都将被添加到队列中,运行程序将使用该队列开始读取。异步函数将添加到队列的末尾

假设此代码:

let a = true;
doSomething();
doSomethingAsync();
doSomething2();
要执行的队列可以如下所示:

let a
doSomething
doSomething2
doSomethingAsync
let a
doSomthing
doSomethingAsync
doSomething2
但是如果您使用
await
,异步代码将添加到调用它的位置。因此添加
wait doSomethingAsync()将使队列如下所示:

let a
doSomething
doSomething2
doSomethingAsync
let a
doSomthing
doSomethingAsync
doSomething2
TL;DR

当您希望立即执行代码时,可以使用
wait
,而不是将其放入队列

JS有一个从运行到完成的保证,所以如果调用
color()
它保证完全运行 没有办法以任何方式阻止它的执行。但是,有异步函数和生成器函数可以分段运行(意思是:直到达到
wait
yield
),因此如果您不想使用
wait
,您必须
yield

 function* color() {
   let string1 = "yellow yeelow";
   console.log(string1);
   yield;

   let string2 = "blu glu";
   console.log(string2);
    yield;

    let string3 = "green freen";
    console.log(string3);
  }

  async function sleep(ms) {
     return new Promise(resolve => setTimeout(resolve,  ms * 1000));
  }


  async function fcall() {
     const it = color();
     let done = false;
     while(!done) {
       ({ done } = it.next());
       await sleep(2);
     }
 }

睡眠不是JS程序设计的一部分,你想实现什么?如果你想在不使用async关键字的情况下对循环的每一个滴答都进行睡眠,我认为你可能必须将其重构为递归函数。但问题是为什么。我想暂停执行几秒钟,然后再恢复。那么,在每次
sleep()
呼叫之前,我如何在不写
wait
的情况下实现它呢?关于我为什么要这样做的问题,答案是——好奇。我对JS有点陌生,我想知道,有没有办法,因此可以传输问号.async/await,让它在不支持这种语法的浏览器上工作,所以有办法。如果你想让它在较旧的浏览器上运行,那么答案是“使用transpiler”,如果你真的想学习如何手工重写它,那么就尝试一下,如果你在尝试时遇到问题,就回到这里。谢谢,但我实际上是在寻找不依赖于该软件包的解决方案。你可以尝试使用
child\u process.execSync
timeout
选项,例如:
typescript函数sleep(timeout){try{child\u process.execSync(`sleep${Math.ceil(timeout/1e3)},{timeout}}}catch{return}}
好的,明白了。谢谢所以我想我必须使用wait。没有别的办法..我没有想到用这种方式使用收益率。谢谢你。