Promise的含义
Promise是异步编程的一种方式,相比于传统的回调函数,更容易理解和查阅,同时可以避免回调地狱的问题
特点:
1.状态不被外界影响,只会受到异步操作结果的影响,如在读取网络数据的时候,读取不到就是失败(pending->rejected),成功就是(pending->fulfilled)
2.状态被改变之后不能再次变化,只能变化一次.
使用方式:实现将异步任务 同步化
new Promise((resolve,reject)=>{//new Promise()返回的是一个 Promise对象,then()返回的也是Promise对象 //主线程执行 //code resolve(value); //value就是then方法中的data参数 ,最后执行该函数 //code 即使上面已经修改了状态但是也可执行,异步任务的执行放到最后。 }).then(function(data){//异步执行 前一个Promise的状态会决定后一个Promise的状态,并执行哪个函数。 //状态为fulfilled return json.post ;// then()返回的Promise对象,而then的回调函数返回的结果是下一个Promise回调函数的参数。 },function(e){ //状态为rejected
}).catch((e)=>{
//如果没有catch捕获错误,外部是无法捕获错误的,不会有任何反应。
//错误会冒泡...前面的错误可能会被catch捕获
//捕获所有的异常,如果之前存在reject的函数(then中的)就不捕获该函数之前的异常了,如果该异常函数之前都不存在任何解决错误的函数就都捕获。
}).finally(()=>{
//不管执行成不成功就得执行的一步
}).done(function(){
//回调链的尾部,保证任何可能出现的错误,防止最后一个Promise出现错误,无法捕获。
})
除了上面显示的一些方法之外还有一些主要的方法:
Promise.all([p1,p2,p3]) all的参数数组(有遍历器接口的对象)中存放的都是Promise对象:
1.只有所有的Promise对象都变成Fulfilled才是Fulfilled
2.只要有一个Promise是rejected就是rejected
(类似于数组的every方法)
Promise.race([p1,p2,p3]) 同上
1.只要有一个状态改变整个的状态就改变
2.整个的状态是率先改变的状态。
Promise.resolve() 将现有的对象转化成Promsie对象
1.参数是一个Promsie对象,直接转换成该参数对象继续执行
2.参数是一个包含then方法的对象,将该对象转换成Promise对象之后,立即执行其内部的then方法,然后再继续执行
3.参数不是一个对象,将该参数作为下次then(resolved回调函数)中的参数。
4.没有参数,直接返回一个Promise,继续执行的then中的resolved回调函数中没有参数。
Promise.reject() 将现有的对象转化成Promise对象 ,基本上和Promise.resolve()相同。
Promise.try() 让同步任务同步执行,异步任务异步执行。
const f = function(){console.log("1")} Promise.try(f); console.log("2"); //1 //2