一. Promise是什么?
Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来。
避免了多级异步操作的回调函数嵌套。
Promise最早是一个函数库,现在已经被ES6写入标准用法。
Promise是一种构造函数。
创建实例如下:
1 //构造函数传参格式固定,就是函数加(resolve,reject)的参数,这是规定!! 2 const myPromise = new Promise(function(resolve, reject){ 3 //自己需要实现的异步操作的内容 4 ...... 5 ...... 6 if(成功) resolve(value); 7 // resolve是js引擎提供定的成功后调用的函数,作用就是手动将该promise的状态由 8 // pending(未完成)变为fulfilled(异步操作成功),然后才能触发之后的回调函数 9 // value值是要传给后面的回调函数的值 10 // 值的内容可以根据业务需求自己定 11 else reject(new Error); 12 // reject也是js引擎提供的失败后调用的函数,作用就是手动将状态由pending变为 13 // rejected(异步操作失败),参数是抛出异常。然后才能触发之后的回调函数 14 })
二、Promise的方法
1)Promise原型上的then方法
then方法返回一个新的Promise实例,所以可以采用链式写法
myPromise.then(function(value){ // 前面实例中resolve方法执行后会触发该方法 // value值就是resolve的参数值 },function(err) { // 前面实例中reject方法执行后会触发该方法 })
2)Promise原型上的catch方法,=then(null, () => {}),所以返回的也是promise,后面还可以跟then或者catch,只在rejected状态触发。
它可以捕获所有之前执行的promise中的错误
最好所有的promise都在最后使用promise方法,不要在then方法中写第二个回调函数
myPromise.then((val) => { //TODO }).then((val) => { // TODO }).catch((err) => { })
3)Promise.resolve()
将非promise对象转为promise对象,状态为fulfilled
4)Promise.reject()
将非promise对象转为promise对象,状态为rejected
5) Promise.all([p1,p2,p3...]) 性质类似数组的every
参数是promise实例,等全部参数fulfilled时,返回成功。
6)Promise.race([p1,p2,p3..]) 性质类似数组的some
7) Promise.try(f) 同步函数保留同步操作,异步函数转为promise。