我想使用 JavaScript 异步/等待

ghs*_*hin 2 javascript asynchronous settimeout promise async-await

给出以下代码:

function timer1(){
  return new Promise(()=>{
    setTimeout(() => {
      console.log("1...");
    }, 1000);
  })
}
function timer2(){
  return new Promise(()=>{
    setTimeout(() => {
      console.log("2...");
    }, 2000);
  })
}
function timer3(){
  return new Promise(()=>{
    setTimeout(() => {
      console.log("3...");
    }, 3000);
  })
}
async function timers(){
  await timer3();
  await timer2();
  await timer1();
}
timers();
Run Code Online (Sandbox Code Playgroud)

输出是:

(After 3 seconds..)
3...
Run Code Online (Sandbox Code Playgroud)

我想得到这个结果:

(After 3 seconds..)
3...
(After 2 seconds..)
2...
(After 1 seconds..)
1...
Run Code Online (Sandbox Code Playgroud)

为什么只打印了一个(3...)?
我想把这三张都打印出来。

小智 6

您需要在执行 setTimout 后解决承诺

function timer1() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("1...");
      resolve();
    }, 1000);
  });
}

function timer2() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("2...");
      resolve();
    }, 2000);
  });
}

function timer3() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("3...");
      resolve();
    }, 3000);
  });
}

async function timers() {
  await timer3();
  console.log("(After 3 seconds..)");
  await timer2();
  console.log("(After 2 seconds..)");
  await timer1();
  console.log("(After 1 seconds..)");
}

timers();
Run Code Online (Sandbox Code Playgroud)