说说promise吧, promise 承诺。Promise的理解就是 我对你做出承诺,我怎么怎么,然后我有可能成功,我做到了, 有可能失败, 我没做到, 就是这么个东西.(说的玄一点, 这是一个异步流程控制的一个东东, 至于什么是异步流程控制?我不知道)
new Promise((resolve, reject)=>{})
Promise的状态变化有两种, 从pending —> fulfilled或者 pending—>rejected
pending 是初始的状态, fulfilled 是成功的状态, 剩下的就是失败的状态rejected
Promise会立即执行, 但是状态的改变需要我们来操作。
let abcc = new Promise((resolve, reject)=> {
console.log('立即执行了')
setTimeout(()=>{
resolve('ccc')
},1000)
setInterval(()=> {
console.log(abcc)
},200)
console.log('立即执行了2')
})
then
当Promise的状态发生改变,使用then方法来触发对应的处理方法.
两个参数: then方法包含两个参数, 对应当Promise的状态为fulfilled和rejected的回调函数
省略参数: 将创建一个没有其他处理程序的新的Promise,继承Promise最终的状态, then被调用, 第几个参数省略,Promise将采用那个状态
由于then方法返回的是一个新的Promise对象, 所以不会影响到当前的Promise对象,由于返回来的是Promise,所以then后面可以then, then, then….无穷无尽,这样完美的避免了 回调地狱.
let o1 = new Promise((resolve,reject) => {
resolve(1)
})
o1.then((value)=>{
console.log('value'+ value) // 1
console.log(o1) // resolved 1
value +=1;
return value;
}).then((value)=>{
console.log(value) //2
console.log(o1) //resolved 1
})
catch
因为我们写的是程序, 所以经常要考虑程序出错的缘故. 就把rejected的函数捕捉给暴露出来了就是所谓的catch, 当状态变为rejected的时候, catch被调用
其实catch就是下面的缩写
Promise.prototype.then(undefined, onRejected)
看下下面这个
var p1 = new Promise(function(resolve, reject) {
resolve('Success');
});
p1.then(function(value) {
console.log(value); // "成功!"
throw 'oh, no!'; or return Promise.reject('oh no ')
}).catch(function(e) {
console.log(e); // "oh, no!"
}).then(function(){
console.log('after a catch the chain is restored');
}, function () {
console.log('Not fired due to the catch');
});
catch返回的Promise状态, 由于catch是then(undefined, onrejected)的缩写, 第一个参数为空, 所以catch返回的Promise状态为成功
Promise.reject(reson)
返回一个用reason拒绝的Promsie
let o = Promise.reject('sss');
o.catch((reason) => {
console.log(reason) // sss
}).then(()=> {
console.log('resolve') // 返回这个 理由在上面自己找
}, ()=> {
console.log('reject')
})
Promise.resolve()
Promise.resolve(value); 正常解析
Promise.resolve(promise); 根据promise的状态来往下传递
Promise.resolve(thenable); 根据then的状态来往下传递
Promise.resolve("Success").then(function(value) {
console.log(value); // "Success"
}, function(value) {
// 不会被调用
})
Promise.all()
当所有参数中的promise都完成, 或者任意一个promise的状态变成reject,返回promise
let o1 = new Promise((resolve,reject)=>{
resolve('1')
})
let o2 = new Promise((resolve,reject)=>{
resolve('2')
})
let o3 = new Promise((resolve,reject)=>{
setTimeout(()=> {
resolve('3')
}, 3000)
})
Promise.all([o1, o2, o3]).then((value)=>{
console.log(value)
}).catch((reason)=>{
console.log(reason)
})
Promise.race()
和all相反, 只要有一个状态改变, 就会返回
可以讲上面的all换成race来玩玩.