1 promise含义
简单说就是一个容器,里面保存着某个
未来才会结束
的事件(通常是一个异步操作的结果)Promise对象代表一个异步操作;
1 特点一(对象状态不受外界影响)
三种状态:pending(进行中)、resolved(已完成)、rejected(已失败)=》只有异步操作结果可以决定是哪一种状态;
2 特点二(一旦转态改变,就不会再改变)
状态改变的两种可能: pending=>resolved ;pending=>rejected
3 优点
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数;
4 缺点
无法取消Promise,一旦创建它就立即执行无法中途取消;
如果不设置毁掉函数,promise内部抛出的错误,不会反映到外部;
当处于pending状态时,无法得知目前进展到哪一个阶段;
如果某些事件不断地反复发生,一般来说,使用 stream 模式是比部署Promise更好的选择。
2 基本用法
promise新建后会立即执行;then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行;
如果调用resolve函数和reject函数时带有参数,那么它们的参数会传递给回调函数
resolve参数:可能是正常值,也可能是另一个promise实例;reject参数通常是Error的实例;
var p1= new Promise(function(resolve,reject){
setTimeout(()=> reject(new Error('fail')),3000)
})
var p2= new Promise(function(resolve,reject){
setTimeout(()=> resolve(p1),3000)
})
p2.then(result=>console.log(result+'1')).catch(error=>console.log(error+'2'))
//Error: fail2 p2返回的是另一个promise,导致p2自己的状态无效
3 Promise.all()
方法用于多个Promise实例,包装成一个新的promise实例;
var p = Promise.all([p1,p2,p3]);(参数可以不是一个数组,但必须有Iterator接口,且返回的成员都是Promise实例,如果参数不是promise实例,将会调用resolve方法转换为promise实例)
p的状态由p1,p2,p3三者全是resolve状态才成功,否则失败;等参数状态都返回了才会触发P的回调函数;
4 Promise.race()
var p = Promise.all([p1,p2,p3]);
方法用于多个Promise实例包装成一个promise实例;参数中有一个状态发生改变p的状态就发生改变;
5 promise.resolve()与promise.reject()
将现有对象转换为promise对象;
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
参数是promise实例,原封不动返回
参数时具有then方法的对象,转换后立即执行then方法;
参数不具有then方法或不是对象,装换后状态为resolved;
不带参数,直接调用回调函数,立即resolve的promise对象,是本轮时间结束时,而不是下一轮事件开始时
setTimeout(function () {
console.log('three');
}, 0);
Promise.resolve().then(function () {
console.log('two');
});
console.log('one');
// one
// two
// three
网友评论