首页 > 解决方案 > 为什么这些关于 timer(setTimeout()) 的代码,Promises 的 then() 方法是这样运行的?

问题描述

const wait = function () {
  return new Promise(function (resolve, reject) {
    resolve()
    setTimeout(console.log('a'), 5000)
  })
}
 
wait().then(() => console.log('b'))

解释代码:

正如你在上面看到的,我创建了一个wait()返回承诺的函数,在这个函数中,resolve()将立即执行,以及一个将在 5 秒后记录“a”消息的计时器。

我所期望的:

所以我期望的是该then()方法将被执行,它then()立即移动到该方法,所以从这里它将记录“b”消息。并且由于 5 秒计时器在后台等待,在 Web API 中,'a' 消息将在 'b' 消息之后记录。

它实际上做了什么:

但是结果是如此不同,两条消息都立即同时记录,并且'a'在'b'之前,5秒还没有过去。大家能不能帮我解释一下,我不太明白,我认为我对then()方法的理解是错误的,所以请知道的帮我修复,非常感谢!

标签: javascriptpromisefrontendsettimeoutasynchronous-javascript

解决方案


  1. 你打电话wait()
  2. wait创建一个新的 Promise
  3. resolve() 立即解决该承诺,但该函数resolve出现在继续运行之前
  4. 你打电话console.log('a')(假设缺少)的是问题中的错字而不是真正的代码)记录a
  5. console.log(which is )的返回值undefined被传递给setTimeout(它什么都不做,因为它不是一个函数)。
  6. 功能结束
  7. 承诺解决发生
  8. then函数被调用
  9. console.log('b')日志b

推荐阅读