未看书导致的一个坑

某日被书中一段代码误导

1
2
3
4
5
6
7
8
9
10
11
var promise = new Promise(function (resolve, reject) {
resolve("ok")
setTimeout(function () {
throw new Error("test")
}, 0)
})
promise.then(function (value) {
console.log(value)
})
//ok
//Uncaught Error : test

由于前面还有这样一段话

如果 Promise 状态已经变成 Resolved,再抛出错误是无效的。

当时看到这,思索了许久,为什么已经 resolve 了这个 ERROR 还是可以往外抛出呢?
后面发现,settimeout 是一个异步函数,throw 会在下一轮事件循环开始时抛出,所以无论是否 resolve,这个 ERROR 都是会抛出的。