promise
- ES6中一个十分好用和重要的个性
- Promise是异步编程的一种计划
什么时候用?
- 个别状况下是有异步操作时,应用Promise对这个异步操作进行封装
Promise需传入俩个参数,resolve(胜利时调用),reject(失败时调用)
new Promise((resolve, reject) => { setTimeout(() => { // 胜利的时候调用resolve // resolve('hello world') // 失败的时候调用reject reject('error message') }, 1000) }).then((data) => { // 1.100行解决的代码 console.log(data); console.log(data); console.log(data); console.log(data); console.log(data); console.log(data); }).catch((err) => { console.log(err) }) //输入 error message
Promise三种状态
- 当开发中有异步操作时,就能够给异步操作包装一个Promise
异步操作之后会有三种状态
- pending:期待状态,比方正在进行网络申请,或者定时器没有到工夫
- fulfill:满足状态,当咱们被动回调了resolve时,就处于该状态,并且会回调.then()
reject:回绝状态,当咱们被动回调了reject时,就处于该状态,并且会回调.catch()
new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve('hlwd') reject('error') },1000) }).then(data => { console.log(data); },err => { console.log(err) })
Promise的链式调用
new Promise((resolve, reject) => { // 第一次网络申请的代码 setTimeout(() => { resolve() }, 1000) }).then(() => { // 第一次拿到后果的解决代码 console.log('hellowd') console.log('hellowd') console.log('hellowd') console.log('hellowd') console.log('hellowd') console.log('hellowd') return new Promise((resolve, reject) => { // 第二次网络申请的代码 setTimeout(() => { resolve() }, 1000) }) }).then(() => { // 第二次拿到后果的代码 console.log('hellow') console.log('hellow') console.log('hellow') console.log('hellow') console.log('hellow') console.log('hellow') return new Promise((resolve, reject) => { // 第三次网络申请的代码 setTimeout(() => { resolve() }) },1000) }).then(() => { // 第三次拿到后果的代码 console.log('hellowd') console.log('hello') console.log('hello') console.log('hello') console.log('hello') console.log('hello') })
简化代码形式:
// 网络申请:aaa -> 本人解决(十行) // 解决:aaa111 -> 本人解决(十行) // 解决:aaa111222 -> 本人解决 new Promise((resolve, reject) => { setTimeout(() => { resolve('aaa') }, 1000) }).then((res) => { // 1.本人解决10行代码 console.log(res, '第一次的十行解决代码'); //2.对后果进行第一次解决 return new Promise((resolve) => { resolve(res + '111') }) }).then((res) => { console.log(res, '第二次的十行解决代码'); return new Promise((resolve) => { resolve(res + '222') }) }).then((res) => { console.log(res, '第三次的10行解决代码'); })
// SIMPLE WRITTEN new Promise((resolve, reject) => { setTimeout(() => { resolve('aaa') }, 1000) }).then((res) => { // 1.本人解决10行代码 console.log(res, '第一次的十行解决代码'); //2.对后果进行第一次解决 return Promise.resolve(res + '111') }).then((res) => { console.log(res, '第二次的十行解决代码'); return Promise.resolve(res + '222') }).then((res) => { console.log(res, '第三次的10行解决代码'); }) // SIMPLE WRITTEN 2 new Promise((resolve, reject) => { setTimeout(() => { resolve('aaa') }, 1000) }).then((res) => { // 1.本人解决10行代码 console.log(res, '第一次的十行解决代码'); //2.对后果进行第一次解决 return res + '111' }).then((res) => { console.log(res, '第二次的十行解决代码'); return res + '222' }).then((res) => { console.log(res, '第三次的10行解决代码'); }) //报错 new Promise((resolve, reject) => { setTimeout(() => { resolve('aaa') }, 1000) }).then((res) => { // 1.本人解决10行代码 console.log(res, '第一次的十行解决代码'); //2.对后果进行第一次解决 return Promise.reject('报错') //or //throw '报错' }).then((res) => { console.log(res, '第二次的十行解决代码'); return Promise.resolve(res + '222') }).then((res) => { console.log(res, '第三次的10行解决代码'); }).catch((eerr) => { console.log(eerr); })
Promise的all办法
退出某一需要要发送两次申请能力实现
Promise.all([ new Promise((resolve, reject) => { setTimeout(() => { resolve('result') }, 2000) }), new Promise((resolve, reject) => { setTimeout(() => { resolve('result2') }, 1000) }) ]).then(results => { console.log(results); })