ES6之Promise
promise是异步编程的一个解决方案
Promise是一个容器,保存着未来才会结束的事件
Promise对象
对象状态不受外界影响
三种状态:pending(进行中),fulfilled(已成功),rejected(已失败)
当前的状态由操作结果决定,其他操作无法影响这个状态
Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected
两种情况发生了,状态就会凝固,状态不会改变,如果改变已经发生了,再对Promise对象添加回调函数,也会立即得到这个结果
Proise缺点
一旦新建就会立即执行,无法取消
如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
promise用法
const promise = new Promise(function(resolve,reject){
if(true){
resolve(value)} //pending=>fullfilled
}) else {
reject(error) //pending=>reject
}
一般来说,调用resolve或reject以后,Promise 的使命就完成了,后继操作应该放到then方法里面
then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行
new Promise((resolve, reject) => {
resolve(1);
console.log(2);}).then(r => {
console.log(r);});
// 2
// 1
resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务,所以先打印2,再打印1
Promise实例是支持链式编程的,因为在then方法是存在原型对象promise.prototype上的
new promise(function(resolve, reject) {
}).then(function(value) {
})
promise.prototype.then(‘resolve回调’,‘rejecte回调(可选)’)//返回一个新的promise实例
当发生错误时,可以使用catch方法中指定的回调函数捕获
const promise = new Promise(function(resolve, reject) {
throw new Error('test');});
promise.catch(function(error) {
console.log(error);});
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获
一般不要在then方法里面定义reject状态的回调函数,用catch来捕获
promise(function(function(val) {
},function(err){
})).then(null,(err)=> {
cnsole.log(err)})等同于
》》》》
promise(function(function(val) {
},function(err){
})).catch((err)=> {
cnsole.log(err)})