有没有不用await关键字的调用sleep()的方法吗?

时间:2019-11-29 06:00:56

标签: javascript node.js asynchronous async-await

我想在没有sleep()关键字的情况下调用await函数。为了实现这一点,我尝试了另一个带有回调的 wrapper-async 函数sleepAsync(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);

在这里可以做什么?我在哪里犯错?

3 个答案:

答案 0 :(得分:0)

您可以从npm试用sleep软件包,请在https://www.npmjs.com/package/sleep上查看。

答案 1 :(得分:0)

如果后面的其余代码没有等待异步功能,那么异步功能将无法在确切的时间工作。

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

假设此代码:

let a = true;
doSomething();
doSomethingAsync();
doSomething2();

要执行的队列可以像这样:

let a
doSomething
doSomething2
doSomethingAsync

但是您使用await时,异步代码将被添加到您调用它的位置。因此,添加await doSomethingAsync();将使队列如下:

let a
doSomthing
doSomethingAsync
doSomething2

TL; DR

  

要立即执行代码而不是将其放在队列中时,请使用await

答案 2 :(得分:0)

JS具有运行到完成保证,因此,如果您调用color(),则可以保证完全运行  无法以任何方式停止执行。但是,有 async函数 generator函数可以分段运行(意味着:直到达到awaityield为止),所以如果您不想使用await,则必须使用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);
     }
 }