Promise 总结
说明
Promise 是一个构造函数,自己身上有 call 、 resolve 、 reject ,原型上有 then 、 catch 等方法。
Promise 对象有以下两个特点
1. 对象的状态不受外界影响。有三种状态: Pending (进行中)、 Resolved (已完成,又称 Fulfilled )和 Rejected (已失败)
2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。 Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected
function runAsync(){ var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('执行完成'); resolve('随便什么数据'); }, 2000); }); return p; } runAsync().then(function(data){ console.log(data); //后面可以用传过来的数据做些其他操作 //...... });
表面上看 Promise 只是简化层层的回调写法,实质上, Promise 的精髓是状态
链式操作的用法
function runAsync1(){ var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('异步任务1执行完成'); resolve('随便什么数据1'); }, 1000); }); return p; } function runAsync2(){ var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('异步任务2执行完成'); resolve('随便什么数据2'); }, 2000); }); return p; } function runAsync3(){ var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('异步任务3执行完成'); resolve('随便什么数据3'); }, 2000); }); return p; }
runAsync1() .then(function(data){ console.log(data); return runAsync2(); }) .then(function(data){ console.log(data); return runAsync3(); }) .then(function(data){ console.log(data); });
reject 的用法
reject 的作用就是把 Promise 的状态置为 rejected ,这样我们在 then 中就能捕捉到,然后执行“失败”情况的回调
then 方法可以接受两个参数,第一个对应 resolve 的回调,第二个对应 reject 的回调。
var promise = new Promise((resolve, reject) => { reject('失败') }) promise.then((data) =>{ console.log('success:' + data) },(reason) => { console.log('error:' + reason); })
catch 的用法
catch 方法,他和 then 的第二个参数一样,用来指定 reject 的回调。但是他还有一个作用:当在执行 resolve 的回调时候,如果出现异常那么 js 不会卡死,而是会进入到 catch 方法中
function getNumber(){ var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ var num = Math.ceil(Math.random()*10); //生成1-10的随机数 if(num<=5){ resolve(num); } else{ reject('数字太大了'); } }, 2000); }); return p; } getNumber() .then(function(data){ console.log(data); console.log(somedata); //此处的somedata未定义 }).then((data) =>{ console.log('success:' + data) },(reason) => { console.log('error:' + reason); }) .catch(function(reason){ console.error(reason); });
all 的用法
Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调
Promise .all([runAsync1(), runAsync2(), runAsync3()]) .then(function(results){ console.log(results); });
race 的用法
Promise .race([runAsync1(), runAsync2(), runAsync3()]) .then(function(results){ console.log(results); });
finally
finally 方法用于指定不管 Promise 对象最后状态如何,都会执行的操作
promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});