一、创建后立即执行
声明p1
后,resolve
或reject
会立即执行,即使没有设置p1.then
或p1.catch
。
二、如果没有设置catch
方法,会把reject
应该捕获的错误抛出来
控制台抛出错误Uncaught (in promise) abc
,如果reject
函数无参数,则抛出Uncaught (in promise) undefined
三、resolve
或reject
函数接收一个Promise
实例
const p2 = new Promise(function (resolve,reject) {
// ...
resolve(p1);
})
3.1
const p2 = new Promise(function (resolve,reject) {
setTimeout(function () {
resolve(p1);
},1000);
});
p2
.then(function (value) {
console.log(value);
})
.catch(function (err) {
console.log(err,'abc');
});
控制台在3s后,打印出123
,p1
和p2
的状态同时在3s后变成resolved
3.2
控制台在3s后,打印出123 abc
,p1
和p2
的状态同时在3s后变成rejected
,p1
的状态决定p2
状态
3.3
控制台在3s后,打印出p1对象 abc
,p1
的状态在1s后变成resolved
,p2
的状态在3s后变成rejected
,二者互相不影响。
3.4
控制台在1s后,抛出Uncaught (in promise) 123
,3s后,打印出p1对象 abc
,p1
状态在1s后变成rejected
,p2
状态在3s后变成rejected
,二者互相不影响。
四、如果Promise状态已经变成resolved
,再抛出错误是无效的
上面代码中,Promise在resolve
语句后面,再抛出错误,不会被捕获,等于没有抛出。因为Promise的状态一旦改变,就永久保持该状态,不会再变了。
五、跟传统的try/catch代码块不同的是,如果没有使用catch方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应
someAsyncThing().then(function() {
console.log('everything is great');
});
setTimeout(() => { console.log(123) },2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123 代码没有中断
一般总是建议,Promise 对象后面要跟catch方法,这样可以处理 Promise 内部发生的错误。catch方法返回的还是一个 Promise 对象,因此后面还可以接着调用then方法。
原文链接:https://www.f2er.com/js/415129.html