1.调用resolve或reject并不会终结 Promise 的参数函数的执行
注意,调用resolve或reject并不会终结 Promise 的参数函数的执行。
1 | new Promise((resolve, reject) => { |
上面代码中,调用resolve(1)以后,后面的console.log(2)还是会执行,并且会首先打印出来。这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。
一般来说,调用resolve或reject以后,Promise 的使命就完成了,后继操作应该放到then方法里面,而不应该直接写在resolve或reject的后面。所以,最好在它们前面加上return语句,这样就不会有意外。
2.报错
1 | window.onerror = handleError |
在Promise报错(无论reject还是throw)都会被window.addEventListener('unhandledrejection', event => {}
接收到,window.onerror
监听不到
window.onerror
只能捕获全局异常
3. 中断或取消Promise链的可行方案
当新对象保持“pending”状态时,原Promise链将会中止执行。
1 | Promise.resolve() |
4 面试题相关
1 | console.log(1) |