Javascript 编写承诺的异步/等待版本

Javascript 编写承诺的异步/等待版本,javascript,async-await,Javascript,Async Await,下面的代码按预期每秒记录一次“hello world” function moveOneStep() { return new Promise((res, rej) => { setTimeout(() => { res(console.log('Hello world!')) }, 1000) }) } async function main() { await moveOneStep(); await moveOneStep();

下面的代码按预期每秒记录一次“hello world”

function moveOneStep() {
  return new Promise((res, rej) => {
    setTimeout(() => {
      res(console.log('Hello world!'))
    }, 1000)
  })  
}

async function main() {
  await moveOneStep();
  await moveOneStep();
  await moveOneStep();
  await moveOneStep();
}
考虑到
async
函数的
return
值对应于Promissions中从
resolve
函数返回的值,为什么下面的代码不输出相同的结果,而是一次记录所有的“hello world”:

async function moveOneStepAsync() {
  setTimeout(() => {
    return console.log('Hello world!');
  }, 1000);
}

async function main() {
  await moveOneStepAsync();
  await moveOneStepAsync();
  await moveOneStepAsync();
  await moveOneStepAsync();
}

这是因为
setTimeout
不会在
main
函数中返回对
wait
的承诺。setTimeout本身是同步执行的。它向事件循环中添加回调,该回调作为参数传递,以便在前面提到的时间内执行

同样在这段代码中,回调的返回意味着什么也没有,因为回调将在1秒内运行,返回的值将不起作用

async
关键字告诉您函数返回promise,其中可能包含
wait
able代码。因此,由于代码中没有wait,因此看起来

function moveOneStepAsync() {
  setTimeout(() => {
    return console.log('Hello world!');
  }, 1000);
  return Promise.resolve();
}
因此,main中的
wait
将等待一个事件循环滴答声进入下一个“步骤”


阅读有关setTimeout、事件循环以及Wait希望更深入地理解它的内容

您不向函数返回任何内容,而是返回内部setTimeout函数,这对该值没有任何作用。调用
setTimeout
不会返回承诺,而是立即返回计时器。因此,所有的
moveOneStepAsync
调用都会立即执行,定时器设置好,一秒钟后就会触发。

您的版本不会返回任何需要等待的值或承诺。请您进一步澄清一下好吗?异步函数返回的不是本质上的承诺吗?我希望能举个例子。你的上述评论应该是问题的一部分,因为它突出了误解的症结所在。@deceze它写在我的第二个例子之前。@UğurKaya我希望你能理解一点