一、什么是Promise?
Promise 是 ES6 引入的异步编程的新解决方案
。语法上 Promise 是一个构造函数
,通过构造函数可以实例化对象new Promise(),用来封装异步操作并可以获取其成功或失败的结果。
那什么时候我们会来处理异步事件呢?
一种很常见的场景应该就是网络请求了。我们封装一个网络请求的函数,因为不能立即拿到结果,所以不能像简单的3+4=7一样将结果返回。所以往往我们会传入另外一个函数,在数据请求成功时,将数据通过传入的函数回调出去。如果只是一个简单的网络请求,那么这种方案不会给我们带来很大的麻烦。
二、什么情况下会用到Promise?
一般情况下是有异步操作时(io操作如:文件io、数据库io、网络请求),使用Promise对这个异步操作进行封装。让多层嵌套变为链式调用,更为优雅。
三、如何使用Promise?
<script> // 1.使用setTimeout // setTimeout(() => { // console.log('Hello World'); // }, 1000) // new -> 构造函数(1.保存了一些状态信息 2.执行传入的函数) // 在执行传入的回调函数时, 会传入两个参数, 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); }).catch((err) => { console.log(err); }) </script>
四、Promise三种状态
当我们开发中有异步操作时, 就可以给异步操作包装一个Promise。异步操作之后会有三种状态
4.1 pending:等待状态
比如正在进行网络请求,或者定时器没有到时间。
4.2 fulfill:满足状态
当我们主动回调了resolve时,就处于该状态,并且会回调.then()
4.3 reject:拒绝状态
当我们主动回调了reject时,就处于该状态,并且会回调.catch()
promise的另一种处理形式
<script> new Promise((resolve, reject) => { setTimeout(() => { // resolve('Hello Vuejs') reject('error message') }, 1000) }).then(data => { console.log(data); }, err => { console.log(err); }) </script>
五、Promise链式调用
<script> // 参数 -> 函数(resolve, reject) // resolve, reject本身它们又是函数。链式编程: new Promise((resolve, reject) => { // 第一次网络请求的代码 setTimeout(() => { resolve() }, 1000) }).then(() => { // 第一次拿到结果的处理代码 console.log('Hello World'); return new Promise((resolve, reject) => { // 第二次网络请求的代码 setTimeout(() => { resolve() }, 1000) }) }).then(() => { // 第二次处理的代码 console.log('Hello Vuejs'); return new Promise((resolve, reject) => { // 第三次网络请求的代码 setTimeout(() => { resolve() }) }) }).then(() => { // 第三处理的代码 console.log('Hello Python'); }) </script>
六、Promise的all方法
Promise.all([ new Promise((resolve, reject) => { setTimeout(() => { resolve({name: 'why', age: 18}) }, 2000) }), new Promise((resolve, reject) => { setTimeout(() => { resolve({name: 'kobe', age: 19}) }, 1000) }) ]).then(results => { console.log(results); //当两个模拟网络请求都完成,才会打印results数组 })
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/blog.moonlet.cn/wp-content/themes/Sakura/functions.php on line 1078
Warning: Undefined variable $robot_comments in /www/wwwroot/blog.moonlet.cn/wp-content/themes/Sakura/comments.php on line 97