阅读 118

ES6 Promise对象

Promise含义

Promise,是一个对象,从它可以获取异步操作的消息。(异步操作不懂的自行查阅)。
特点:1)对象的状态不受外界影响。三种状态pending(进行中),fulfilled(已成功),rejected(已失败),只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。
Promise状态改变的可能:pending-->fulfilled ,pending-->rejected。只要这两种情况发生,会一直保持这个结果,称之为resolved(已定型)。

基本用法

const promise = new Promise(function(resolve,reject){
...
if(//异步操作成功){
resolve(value);
}else{
reject(error);
}
});

Promise简单例子

function timeout(ms) {
return new Promise((resolve, reject) => {
console.log("promise");
setTimeout(resolve, ms, 'done');
});
}
timeout(1000).then((value) => {
console.log(value);
});
console.log("111");
//promise
//111
//done
解析:timeout方法返回的是一个Promise实例,setTimeout传的参数为1000,表示1秒后,Promise实例状态变为resolved,触发then绑定的回调函数。then方法的回调函数在当前脚本所有同步任务执行完才会执行,所以done最后输出。

注意:调用resolve或reject后,Promise的使命就完成了,继续操作应放在then里面,所以我们可以在前面加上return语句。

Promise.prototype.then()

then方法是定义在原型对象Promise.prototype上的,作用是为 Promise 实例添加状态改变时的回调函数。
then方法返回的是一个新的Promise实例。
then方法后面再调用另一个then方法。(这些概念性的知道就ok了)
例:
...().then(function(a){
return a.b;
}).then(function(b){
...
});//可以使用箭头函数,让代码更简洁。
第一个回调函数完成后,将返回的结果作为参数传入第二个回调函数。
如果前一个回调函数返回的是一个Promise对象,这时,后一个回调函数需要等待Promise对象状态发生变化才会被调用。

Promise.prototype.catch()

用于指定发生错误时的回调函数。
用法:
const promise = new Promise(function(resolve,reject){
reject(new Error('err')); //等同于try-catch抛出错误
});
promise.catch(function(err){
console.log(err);
});
注意:1.如果在resolve语句后面抛出错误,不会被捕获,等于没有抛出。
2.Promise对象的错误具有冒泡性质,会一直传递直到捕获为止。
....then(...).then(...).catch(...//处理前三个Promise产生的错误);
3.如果不使用catch方法,抛出的错误不会传递到外层代码,即不会有任何反应。
4.catch方法返回的还是一个 Promise 对象,因此后面还可以接着调用then方法,如果没有报错,会跳过catch方法,接着运行后面的then方法。如果catch方法报错,我们可以接着用catch方法捕获前一个catch方法抛出的错误。

Promise.prototype.finally()

finally方法里的代码都会被执行。
用法:promise.then(result=>{...}).catch(err=>{...}).finally(()=>{...});

Promise.reject()

用法:const p = Promise.reject("err");
p.then(err=>{
console.log(err);
})

作者:BSKSdorica

原文链接:https://www.jianshu.com/p/d1b0fdd15d45

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐