javaScript-promise

Posted guardwhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaScript-promise相关的知识,希望对你有一定的参考价值。

1.1 什么是promise?

promise是ES6中新增的异步编程解决方案, 在代码中的表现是一个对象。

promise作用

企业开发中为了保存异步代码的执行顺序, 那么就会出现回调函数层层嵌套。

如果回调函数嵌套的层数太多, 就会导致代码的阅读性, 可维护性大大降低。

promise对象可以将异步操作以同步流程来表示, 避免了回调函数层层嵌套(回调地狱)。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<script>
  // 1.使用setTimeout
  // setTimeout(() => {
  //   console.log('Hello World');
  // }, 1000)

  // 什么情况下会用到Promise?
  // 一般情况下是有异步操作时,使用Promise对这个异步操作进行封装
  // 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);
    console.log(data);
    console.log(data);
  }).catch((err) => {
    console.log(err);
  })
</script>
</body>
</html>

执行结果

1.2 如何创建Promise对象

可以通过new Promise(function(resolve, reject){ });promise对象不是异步的, 只要创建promise对象就会立即执行存放的代码。

promise对象是通过状态的改变来实现的, 只要状态发生改变就会自动触发对应的函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
</head>
<body>
    <script>
    /*什么情况下会用到Promise?
      一般情况下是有异步操作时,使用Promise对这个异步操作进行封装
      new -> 构造函数(1.保存了一些状态信息  2.执行传入的函数)
      在执行传入的回调函数时, 会传入两个参数, resolve, reject.本身又是函数
    */
      new Promise((resolve, reject) =>{
          setTimeout(() =>{
              // 1.成功的时候调用resolve
              // resolve("hello Vue.js!!!!")
              // 2.失败的时候调用reject
              reject('error message')
          }, 1000)
      }).then(data =>{
          console.log(data);
      },err =>{
          console.log(err);
      })
    </script>
</body>
</html>

执行结果

1.3 Promise对象三种状态

  • pending: 默认状态,只要没有告诉promise任务是成功还是失败就是pending状态。
  • fulfilled(resolved): 只要调用resolve函数, 状态就会变为fulfilled, 表示操作成功。
  • rejected: 只要调用rejected函数, 状态就会变为rejected, 表示操作失败。

三种状态注意点

状态一旦改变既不可逆, 既从pending变为fulfilled, 那么永远都是fulfilled。既从pending变为rejected, 那么永远都是rejected。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
   <script>
    /*什么情况下会用到Promise?
      一般情况下是有异步操作时,使用Promise对这个异步操作进行封装
      new -> 构造函数(1.保存了一些状态信息  2.执行传入的函数)
      在执行传入的回调函数时, 会传入两个参数, resolve, reject.本身又是函数
    */
    new Promise((resolve, reject) =>{
        // 第一次网络请求的代码
        setTimeout(() =>{
            resolve()
        },1000)
    }).then(() =>{
        // 第一次拿到结果的处理代码
        console.log("hello Vue.js!!!!");
        console.log("hello Vue.js!!!!");
        console.log("hello Vue.js!!!!");

        return new Promise((resolve, reject) =>{
              // 第二次网络请求
            setTimeout(() =>{
                resolve()
            }, 1000)
        })
    }).then(() =>{
        // 第二次拿到结果的处理代码
        console.log("hello python!!!");
        console.log("hello python!!!");
        console.log("hello python!!!");
        console.log("hello python!!!");

        return new Promise((resolve, reject) =>{
            // 第三次网络请求
            setTimeout(() =>{
                resolve()
            })
        })
    }).then(() =>{
        // 第二次拿到结果的处理代码
        console.log("hello javascript!!!");
        console.log("hello javaScript!!!");
        console.log("hello javaScript!!!");
        console.log("hello javaScript!!!");
    })
   </script>
</body>
</html>

1.4 链式调用简写

可以将数据直接包装成Promise.resolve,那么在then中可以直接返回数据。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        new Promise((resolve, reject) =>{
            setTimeout(() =>{
                resolve('111')
            },1000)
        }).then(res =>{
            // 1.自己处理该行代码
            console.log(res, '第一次拿到结果的处理代码')
            // 2.对结果进行第一次处理
            // return Promise.resolve(res + '111');

            // return Promise.reject('error message')

            // 3.简写
            throw 'error message'

        }).then(res =>{
            console.log(res, '第二次拿到结果处理代码')
            return Promise.resolve(res + '222')
        }).then(res =>{
            console.log(res, "第三次拿到结果处理代码")
        }).catch(err =>{
            console.log(err);
        })
    </script>
</body>
</html>

执行结果

1.5 Promise的all静态方法

  • all方法接收一个数组,如果数组中有多个Promise对象,只有都成功才会执行then方法。
  • 并且会按照添加的顺序, 将所有成功的结果重新打包到一个数组中返回给我们。
  • 如果数组中不是Promise对象, 那么会直接执行then方法。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        Promise.all([
            new Promise((resolve, reject) =>{
                setTimeout(() =>{
                    resolve({name:'guardwhy', age:18})
                },2000)
            }),
            new Promise((resolve, reject) =>{
                resolve({name: 'James', age:'33'})
            }, 1000)
        ]).then(results =>{
            console.log(results);
        })
    </script>
</body>
</html>

执行结果

以上是关于javaScript-promise的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数