Promise
是一个异步编程的解决方案,他常常和ajax
一块儿出现,致使不少人觉得Promise
是一种新的网络请求技术,其实否则。Promise
是一种思考方式、编程方式。ajax
先写一个栗子编程
setTimeout(()=>{ console.log('here') },3000)
很简单,3s以后将会打印出here
,如今换成Promise
:promise
new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve() }, 3000) }).then(()=>{ console.log('here') })
执行结果也是同样,3s以后将会输出here
,还能够这么写网络
let proxy=new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve() }, 3000) }) setTimeout(()=>{ proxy.then(()=>{ console.log('here') }) }, 10000)
13s后才输出here
异步
语法异步编程
new Promise(executor)
参数:函数
(resolve, reject)=>{}
Promise
实例栗子code
let promise=new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve() }, 3000) }) console.log(promise) // Promise {<pending>}
说明:
使用new Promise
实例化一个Promise
以后,将它输出出来,能够看到他有一个pending
,这是说明这个promise
的状态,称为PromiseStatus
,promise
一共有3种状态,一个promise
一定处于下面三个状态之一:console
pending
:初始状态fulfilled
:操做成功rejected
:操做失败then
语法:变量
promise.then(onFulfilled, onRejected)
onFulfilled
:操做成功的回调onRejected
:操做失败的回调栗子1:
let promise=new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve() }, 3000) }) console.log(promise) // Promise {<pending>} promise.then(()=>{ console.log(promise) // Promise {<resolved>: undefined} })
说明1:
当调用resolve
以后,then
函数执行了,同时promise
的PromiseStatus
变成了resolved
。onFulfilled
同时接受一个变量,称之为PromiseValue
:
let promise=new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve(1) }, 3000) }) promise.then((value)=>{ console.log(value) // 1 })
栗子2:
let promise=new Promise((resolve, reject)=>{ setTimeout(()=>{ reject() }, 3000) }) console.log(promise) // Promise {<pending>} promise.then(()=>{},()=>{ console.log(promise) // Promise {<rejected>: undefined} })
当调用reject
以后,then
执行了,此时promise
的PromiseStatus
变成了rejected
,同时,onRejected
回调接受一个reason
,做为操做失败的缘由说明:
let promise=new Promise((resolve, reject)=>{ setTimeout(()=>{ reject('nothing') }, 3000) }) promise.then(()=>{},(reason)=>{ console.log(reason) // nothing })
catch
语法:
promise.catch(onRejected)
onRejected
:回调栗子:
let promise=new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve() }, 3000) }).then(()=>{ throw 'error' }).catch((e)=>{ console.log(`i catch you: ${e}`) // i catch you error })
注意1:在异中的错误不会执行catch
let promise=new Promise((resolve, reject)=>{ setTimeout(()=>{ throw 'error' }, 3000) }).catch((e)=>{ console.log(`i catch you: ${e}`) // Uncaught error })
注意2:resolve
以后会被忽略
let promise=new Promise((resolve, reject)=>{ resolve() throw 'error' }).catch((e)=>{ console.log(`i catch you: ${e}`) // 不会输出 })
finally
语法:
p.finally(onFinally)
onFainally
:回调栗子:
let promise=new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve() }, 3000) }).then(()=>{ console.log('resolve') throw 'error' }).catch((e)=>{ console.log(`i catch you: ${e}`) }).finally(()=>{ console.log('finally') }) // resolve // i catch you error // finally