javascript - 为什么这些关于 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()
方法的理解是错误的,所以请知道的帮我修复,非常感谢!
解决方案
- 你打电话
wait()
wait
创建一个新的 Promiseresolve()
立即解决该承诺,但该函数resolve
出现在继续运行之前- 你打电话
console.log('a')
(假设缺少)
的是问题中的错字而不是真正的代码)记录a
console.log
(which is )的返回值undefined
被传递给setTimeout
(它什么都不做,因为它不是一个函数)。- 功能结束
- 承诺解决发生
- 该
then
函数被调用 console.log('b')
日志b
。
推荐阅读
- c++ - 在 MacOS 上使用 CLion 编译 32 位 C++ 程序
- reactjs - borderBottomRightRadius 在 React Native 中不起作用
- python - OpenCV Python中的视频文件与实时网络摄像头提要窗口大小
- java - 在android中使用日志调试的正确方法?断点
- c# - “SettingsViewModel”类型不包括任何可访问的构造函数。有没有办法摆脱这个错误?
- sqlite - 如何删除sqlite3中数据库的所有文件?
- ios - 如何创建轮播视图
- java - 在执行实际操作之前对 Web 元素进行一些标准验证
- java - 不了解 Java 中的一些基本编译错误
- cassandra-3.0 - Cassandra 数据类型持续时间在 sstableloader 中失败