zoukankan      html  css  js  c++  java
  • promise

    Promise的三种状态?
        pending 等待中(promise封装的是一个异步操作,异步操作是需要时间的)
        fulfilled 成功 resolve()
        rejected 失败  reject()
    状态只有两种情况:
        01 pending --> fulfllied
        02 pending --> rejected
    状态只要发生改变了,就不会再次改变   




    1
    <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 </head> 9 <body> 10 <script> 11 // Promise 单词表示承诺 12 // 是干嘛的? 是js中一种异步编程的解决方案(使异步函数可以同步执行),在没有promise之前,js是通过回调函数来实现异步编程的同步操作的 13 // Promise 解决了什么问题? 回到地狱,回调地狱是什么?回调函数层层嵌套 14 // promise的优势? 使异步函数可以同步的执行,解决了回调地狱的问题 15 // Promise是一个构造函数 16 // 理解:它是一个容器,内部分装了异步操作 17 // 参数:回调函数 18 // resolve表示then方法的回调函数 19 // 参数:lei hao a 会传递给data 20 21 22 // 成功 23 const p=new Promise(function(resolve,reject){ 24 // 异步操作成功就调用resolve 25 // 异步操作失败就调用reject 26 setTimeout(()=>{ 27 //参数:表示成功后,要传递的数据 28 resolve('lei hao a') 29 },2000) 30 }) 31 p.then(function(data){ 32 console.log('异步操作成功了',data) //两秒后输出 异步操作成功了 lei hao a 33 }) 34 35 36 37 38 39 // 失败 40 const L=new Promise(function(resolve,reject){ 41 // 异步操作成功就调用resolve 42 // 异步操作失败就调用reject 43 setTimeout(()=>{ 44 //参数:表示失败后:会将参数传递给err 45 reject('出错了') 46 },2000) 47 }) 48 L.then(function(data){ 49 console.log('异步操作成功了',data) 50 }).catch(function(err){ 51 console.log(err) 52 }) 53 54 </script> 55 </body> 56 </html>

     

     

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Document</title>
    </head>
    <body>
          <script>
                function fn(){
                    return new Promise((resolve)=>{
                        setTimeout(()=>{
                            console.log("第一")
                            resolve()
                        },2000)
                    })
                }
    
                function fn2(){
                    return new Promise((resolve)=>{
                        setTimeout(()=>{
                            console.log("第二")
                            resolve()
                        },2000)
                    })
                }
    
                function fn3(){
                    return new Promise((resolve)=>{
                        setTimeout(()=>{
                            console.log("第三")
                        },2000)
                    })
                }
    
    
                // fn().then(fn2).then(fn3)
                (async function(){
                    await fn()
                    await fn2()
                    await fn3()
                })()
          </script>
    </body>
    </html>

     

     

     

     

     

     

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Document</title>
    </head>
    <body>
          <script>
                function liang(){
                      return new Promise(function(resolve){
                            var bang="亮儿的接力棒"
                            console.log("亮起跑...");
                            setTimeout(function(){
                                  console.log("亮到达终点")
                                  resolve(bang);
                            },3000)
                      })  
                }
    
                function ran(bang){
                      return new Promise(function(resolve){
                            console.log("ran然拿着"+bang);
                            setTimeout(function(){
                                  console.log("然到达终点")
                                  resolve(bang);
                            },5000)
                      }) 
                }
    
                function dong(bang){
                      return new Promise(function(resolve){
                            console.log("dong然拿着"+bang);
                            setTimeout(function(){
                                  console.log("然到达终点")
                                  resolve();
                            },8000)
                      })
                }
    
    
                // liang().then(ran).then(dong).then(function(){
                //      console.log("比赛结束")
                // })
                // ES7  啊sing靠  await  额为特是等待的意思,执行完才执行
                // 简化then()的时候用
    
                (async function(){
                      await  liang(); 
                      await  ran();
                      await  dong();
                      console.log("比赛结束") 
                })()
    
                /* 传参
                (async function(){
                      var bang=await  liang(bang);  // reutrn 回来的open(bang)
                      bang=await  ran(bang);
                      await  dong(bang);
                      console.log("比赛结束")
                })()
                */
                // 写一个async 函数自调,在里面  直接调用函数,在函数前加上 await就可以,await是等待完才执行, 
                // async和 await 配合 代替es6中的then(),更容易理解,更直观,更简化 
          </script>
    </body>
    </html>

     

     

     

    <script>
          function fn (){
                return new Promise((resolve,reject)=>{
                      setTimeout(() => {
                            resolve('周浩')
                      }, 2000);
                })
          }
          // async 是用来修饰一个函数的 
          // async 要放在function 之前
          async function foo(){
                // await 关键字只能用在async函数中
                // await 关键字后面跟一个Promise对象
                // await 会等待Promise封装的异步操作执行完毕,才会执行后边的代码
                // res就是promise中 resolve的参数
               var res =await fn()
                console.log(res)//2000好秒后 输出   "周浩"
          }
          foo()
           
    </script>

     

      <script>
          // 1  Promise.all([])   等所有请求都完成后,再执行后边的操作
            Promise.all([
                  axios.get('http://localhost:3000/user'),
                  axios.get('http://localhost:3000/student'),
                  axios.get('http://localhost:3000/teacher'),
            ])
            .then((res)=>{
                // console.log(res)
            })
    
    
    
    
          // 2  只要有一个请求完成了,就执行一些操作
          Promise.race([
                  axios.get('http://localhost:3000/user'),
                  axios.get('http://localhost:3000/student'),
                  axios.get('http://localhost:3000/teacher'),
          ])
          .then((res)=>{
                console.log(res)
          })
    
    
          
    
     // 3  Promise.resolve() 方法用来直接获取到一个成功的Promise对象
        Promise .resolve('123')
          .then(res => {
            console.log(res)
          })
    
    
    //  4 直接获取到一个失败的Promise对象
        Promise.reject()
    
      </script>

    案例  promise  和 async 配合 await 的使用

    结果:点击按钮触发事件后,同步执行,先等5s输出 1,然后输出2

    <!DOCTYPE html>
    <html lang="en">
    <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Document</title>
    </head>
    <body>
          <div id="btn" >按钮</div>
          <script>
                function ajaxyb (){
                  return new Promise ((resove,reject)=>{
                      setTimeout (()=>{
                            console.log(1)
                            resove()
                      },5000)
                  })
                } 
          var btn = document.getElementById('btn')
          btn.onclick= async function (){
                await ajaxyb()
                console.log(2)
          }
          </script>
    </body>
    </html>

    案例2

        fetchPublicKey() {
          return new Promise((resolve) => {
            AuthorityApi.fetchPublicKey().then((res) => {
              this.publicKey = res.data
              resolve()
            })
          })
        },
        async submitForm() {
          await this.fetchPublicKey()
          await this.$refs.regForm.validate((valid) => {
            if (valid) {
              var tmpData = {
                account: this.regForm.user,
                passwordMap: SmUtils.encryptSm2(this.regForm.pass, this.publicKey),
                membersType: this.regForm.membersType,
                verifycode: this.regForm.verifycode,
                publicKey: this.publicKey
              }
              AuthorityApi.register(tmpData).then((res) => {
                this.$router.push({ path: 'MemberType',
                  query: {
                    membersId: res.data.membersId,
                    membersType: this.regForm.membersType
                  }})
              })
            } else {
              console.log('error submit!!')
              return false
            }
          })
        },
    const fs = require('fs')
    
    // 使用Promise封装异步操作
    function readFile(path) {
      const p = new Promise(function(resolve, reject) {
        fs.readFile(path, function(err, data) {
          if (err) {
            return reject(err)
          }
    
          resolve(data.toString())
        })
      })
      return p
    }
    
    // async 和 await 是异步编程的终极解决方案
    async function fn() {
      // await 的返回值是 后面Promise 成功的结果,也就是 resolve 方法的参数
      try {
        const a = await readFile('./data/aa.txt')
        console.log(a)
      } catch (err) {
        console.log('出错了:', err)
      }
    
      const b = await readFile('./data/b.txt')
      const c = await readFile('./data/c.txt')
      const d = await readFile('./data/d.txt')
    
      console.log(b)
      console.log(c)
      console.log(d)
    }
    
    fn()
    
    console.log('abc')
    
    // Promise是可以无限调用  then 方法的
    // 每一个后面的 then ,都可以获取到前一个 then 的返回值
    /* 
    readFile('./data/a.txt')
      .then(function(data) {
        console.log('a: ', data)
        return readFile('./data/b.txt')
      })
      .then(function(data) {
        console.log('b: ', data)
        return readFile('./data/c.txt')
      })
      .then(function(data) {
        console.log('c: ', data)
        return readFile('./data/d.txt')
      })
      .then(function(data) {
        console.log('d: ', data)
      })
     */
    /* function readFile(path, callback) {
      fs.readFile(path, function(err, data) {
        callback(data)
      })
    }
     */
    

      

         async showResult() {
            try{
              this.pictLoading = true  //显示
              this.showResultDialog = true
              setTimeout(async () => {
                const result =  await this.formatDataList()  //发送异步请求
                this.dialogData = result.finalResult
                this.pictLoading = false //隐藏
              }, 1000);
            }catch (err){
              console.log(err)
            }
          },
  • 相关阅读:
    942. 增减字符串匹配
    116. 填充每个节点的下一个右侧节点指针
    剑指 Offer 35. 复杂链表的复制
    实验排序
    543. 二叉树的直径
    面试题 08.08. 有重复字符串的排列组合
    微信开发者工具
    打印机链接
    图片上下左右居中
    学习 视频网站
  • 原文地址:https://www.cnblogs.com/javascript9527/p/11374073.html
Copyright © 2011-2022 走看看