Javascript Promise with等待说明

Fra*_*ank 3 javascript promise async-await

我只想了解诺言和等待如何共同努力。看下面的代码:

console.log("One: Started");
setTimeout(function(){console.log("One: Completed")}, 1000);
console.log("Two: Started");
setTimeout(function(){console.log("Two: Completed")}, 2000);
console.log("Three: Started");
setTimeout(function(){console.log("Three: Completed")}, 3000);
Run Code Online (Sandbox Code Playgroud)

因此,这当然会记录:

One: Started
Two: Started
Three: Started
One: Completed
Two: Completed
Three: Completed
Run Code Online (Sandbox Code Playgroud)

我想在下一个开始之前完成一个。我以对诺言的理解和等待的方式写了这篇文章,但这是行不通的。有人可以尝试编辑此代码以使其正常工作。在我试图理解承诺并等待时,请提供一个解释

async function LogAll() {
    console.log("One: Started");
    await function() {
        return new Promise((resolve, reject) => {
            setTimeout(function(){
                console.log("One: Completed");
                resolve();
            }, 1000);
        });
    }
    console.log("Two: Started");
    await function() {
        return new Promise((resolve, reject) => {
            setTimeout(function(){
                console.log("Two: Completed");
                resolve();
            }, 2000);
        });
    }
    console.log("Three: Started");
    await function() {
        return new Promise((resolve, reject) => {
            setTimeout(function(){
                console.log("Three: Completed");
                resolve();
            }, 3000);
        });
    }
}

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

Cer*_*nce 5

您需要await 承诺,而不仅仅是功能。当您await function ...(不调用它)时,该函数将作为一个表达式求值,然后被丢弃。只需调用函数:

async function LogAll() {
  console.log("One: Started");
  await (function() {
    return new Promise((resolve, reject) => {
      setTimeout(function() {
        console.log("One: Completed");
        resolve();
      }, 1000);
    });
  })();
  console.log("Two: Started");
  await (function() {
    return new Promise((resolve, reject) => {
      setTimeout(function() {
        console.log("Two: Completed");
        resolve();
      }, 2000);
    });
  })();
  console.log("Three: Started");
  await (function() {
    return new Promise((resolve, reject) => {
      setTimeout(function() {
        console.log("Three: Completed");
        resolve();
      }, 3000);
    });
  })();
}

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

或者,对于此示例,根本不使用函数-直接等待诺言:

async function LogAll() {
  console.log("One: Started");
  await new Promise((resolve, reject) => {
    setTimeout(function() {
      console.log("One: Completed");
      resolve();
    }, 1000);
  });
  console.log("Two: Started");
  await new Promise((resolve, reject) => {
    setTimeout(function() {
      console.log("Two: Completed");
      resolve();
    }, 2000);
  });
  console.log("Three: Started");
  await new Promise((resolve, reject) => {
    setTimeout(function() {
      console.log("Three: Completed");
      resolve();
    }, 3000);
  });
}

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