ES6-Promise
Promise的含义
Promise是异步编程的一种解决方案。简单来说,promise就是一个容器,里面保存着某个未来才会结束的事件(通常为一个异步操作)的结果。从语法上来说,promise是一个对象,它可以获取异步操作的消息。Promise提供统一的API。
特点:
1.对象的状态不受外界的影响。有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。
2.一旦状态改变就不会再变,任何时候都可以得到这个结果;
基本用法
ES6规定,Promise对象是一个构造函数,用来生成Promise实例
var promise=new Promise(function(resolve,regect){
//some code
if(/*异步操作成功*/){
resolve(value);
}else{
reject(error);
}
})
promise.then(function(value){
//success
},function(error){
//failure;
})
*then方法指定的回调函数将会在当前脚本的所有同步任务执行完成之后才会执行。
*立即resolved的promise是在本轮时间循环的末尾执行,总是晚于本轮循环的同步任务。
promise.prototype.then()
定义在原型对象promise.prototype上,为promise实例添加状态改变是的回调函数
promise.prototype.catch()
是.then(null,rejection)的别名,用于指定发生错误时的回调函数。
getJSON('/post.json').then(function(post){
//...
}).catch(function(error){
//处理getJSON和前一个回调函数运行时发生的错误
console.log("error!",error);
})
promise对象的错误有“冒泡”性质,会一直向后传递,直到被捕获为止。
promise.all()
用于将多个promise实例包装成一个新的 promise实例
var p=promise.all([p1,p2,p3])
只有这其中包含的所有实例状态都变成fulfiled,或者其中一个变成rejected,才会调用promise.all方法后面的回调函数。
promise.race()
将多个promise实例包装成一个新的promise。与promise.all()方法一样。
promise.resolve()
将现有的对象转为promise对象。
promise.resolve()方法的参数分为:
1.参数是一个promise实例
2.参数是一个thenable对象
thenable对象指的是居于then方法的对象,例如:
let thenable={
then:function(resolve,reject){
resolve(42);
}
}
promise.resolve方法会将这个对象转换为promise对象,然后立即执行thenable对象的then方法。
3.参数不是具有then方法的对象或者根本不是对象
4.不带有任何参数
立即resolve的promise对象是在本轮“事件循环”结束时
promise.reject()
返回一个新的promise实例,状态为rejected,并且回调函数会立即执行。
两个有用的附加方法
done()
总是处于回调链的尾端,保证抛出任何可能出现的错误
finally()
该方法用于指定不管promise对象最后状态如何都会执行的操作,接受一个普通的回调函数作为参数
应用
1.加载图片
可以将图片加载写成一个promise,一旦加载完成,promise的状态就发生变化
const preloadImage=function(path){
return new Promise(function(resolve,reject){
var image=new Image();
image.onload=resolve;
image.onerror=reject;
image.src=path;
});
};