if(!window.onrejectionhandled) window.onrejectionhandled = function (){
console.log('window.onrejectionhandled', '被捕获', arguments)
}
window.addEventListener('rejectionhandled', window.onrejectionhandled, true)
window.addEventListener("rejectionhandled", event => {
console.log("Promise rejected; reason: " + event.reason);
}, false);
写了好几个都没触发。网上这个垃圾文章也看不明白。
chrome: 版本 96.0.4664.110(正式版本) (x86_64)
贴一堆测试代码
let promise1 = new Promise(function (reslove) {
console.log(Date.now())
setTimeout(() => {
console.log(Date.now())
reslove(Date.now())
}, 500)
})
let promise2 = new Promise(function (reslove) {
console.log(Date.now())
setTimeout(() => {
console.log(Date.now())
reslove(Date.now())
}, 800)
})
promise1.then(console.log)
Promise.resolve(promise1).then(console.log)
Promise.all([promise1, promise2]).then(console.log)
Promise.reject(1).then(console.log);
Promise.reject(2).then(console.log).catch(v => Promise.reject(3));
Promise.reject(2).then(console.log).catch(v => Promise.reject(3)).then(console.log);
Promise.reject(2).then(console.log).catch(v => v).then(console.log);
Promise.reject(4).then(console.log).catch(v => 5).then(console.log);
Promise.resolve(1).then(v => { const a = 1; a++ }).then(console.log)//.catch(console.log)
Promise.resolve(1).then(v => { const a = 1; a++ }).then(console.log).catch(console.log)
new Promise(function (resolve, reject) {
resolve('1')
})
new Promise(function (resolve, reject) {
reject('2')
})
new Promise(function (resolve, reject) {
reject('3')
})
new Promise(function (resolve, reject) {
setTimeout(v => resolve('1'), 1000)
}).then((...args) => console.log('1-1-then', args))
new Promise(function (resolve, reject) {
setTimeout(v => reject('2'), 1000)
}).then((...args) => console.log('1-1-then', args))
new Promise(function (resolve, reject) {
setTimeout(v => reject('3'), 1000)
}).then((...args) => console.log('1-1-then', args)).catch((...args) => console.log('1-2-catch', args))
new Promise(function (resolve, reject) {
setTimeout(v => reject('4'), 1000)
}).then((...args) => console.log('1-1-then', args)).catch((...args) => console.log('1-2-catch', args)).then((...args) => console.log('1-3-then', args))
const promise1 = new Promise(function (resolve, reject) {
setTimeout(() => {
resolve(1000)
}, 500)
})
const promise2 = new Promise(function (resolve, reject) {
setTimeout(() => {
reject(1001)
}, 500)
})
const promise3 = new Promise(function (resolve, reject) {
setTimeout(() => {
reject(1002)
}, 500)
})
setTimeout(() => promise1.then(console.log), 3000)
setTimeout(() => promise2.catch(console.log), 3000)
setTimeout(()=>promise3.catch(console.log), 100)
终于找到了人言:你不能在控制台使用它。你需要写在代码中,比如说 script 标签中。
必须是一个宏任务执行完成,没有 catch ,下个宏任务 catch 才会触发。同步、微任务都不行。
测试地址:http://jsrun.net/HI9Kp/edit
找到一些说法。但是还是没有解决问题