专业的编程技术博客社区

网站首页 > 博客文章 正文

ES6 新特性之Promise(es6promise的理解)

baijin 2024-10-27 19:21:06 博客文章 10 ℃ 0 评论

概述:

Promise是ES6引入的异步编程新的解决方案,语法上Promise的一个构造函数,用来封装异步操作并可以获取成功或是失败的结果;

  1. Promise构造函数:Promise(excutor){};
  2. Promise.prototype.then()方法
  3. Promise.prototype.catch()方法


基本使用:

<!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>Promise</title>
</head>

<body>
    <script>
        //实例化Promise
        //Promise的三种状态:初始化,成功,失败
        const p = new Promise(function (resolve, reject) {
            setTimeout(() => {
                // //成功
                // let data = "数据";
                // //调用resolve,这个Promise对象状态就会变为成功
                // resolve(data);
                let err = "失败";
                reject(err);
            }, 1000);
        });
        //调用Promise的then()方法,两参数为传值
        p.then((value) => {
            console.log(value); //成功
        }, (season) => {
            console.log(season); //失败
        })
    </script>
</body>

</html>

Promise封装读取文件:

//1.引入fs模块
const { log } = require("console");
const fs = require("fs");
//2.调用方法,读取文件
fs.readFile("G:/code/ES6/1.txt", (err, data) => {
  //如果失败则抛出异常
  if (err) {
    throw err;
  } else {
    //正常输出内容
    console.log(data.toString());
  }
})

运行结果:

Promise封装:

//1.引入fs模块
const fs = require("fs");
//2.使用Promise封装
const p = new Promise((resolve, data) => {
    fs.readFile("E:/code/ES6/1.txt", (err, data) => {
        //如果失败
        if (err) reject(err)
        //如果成功
        resolve(data);
    });
});
p.then((value) => {
    console.log(value.toString());
}, (reason) => {
    console.log(reason);//读取失败
});

运行结果:

Promise封装Ajax请求:

<!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>Promise封装Ajax请求</title>
  </head>
  
  <body>
    <script>
      //请求地址:https://api.apiopen.top/getJoke
      //原生
      //1.创建对象
      const xhr = new XMLHttpRequest();
      let url = "https://api.apiopen.top/getJoke";
      //2.初始化
      xhr.open("GET", url);
      //3.发送
      xhr.send();
      //4.绑定事件,处理响应结果
      xhr.onreadystatechange = function () {
        //判断状态
        if (xhr.readyState = 4) {
          //判断状态码200-299
          if (xhr.states >= 200 && xhr.status <= 299) {
            //成功
            console.log(xhr.response);
          } else {
            //失败
            console.error(xhr.status);
          }
        }
      }
    </script>
  </body>
  
</html>

运行结果:

Promise.prototype.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>Promise.prototype.then</title>
</head>

<body>
    <script>
        //创建Promise对象
        const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("用户数据");
            }, 1000);
        });
        //调用then方法,返回的是Promise对象
        //对象的状态由回调函数的结果决定
        const result = p.then(value => {
            console.log(value);
            //1.如果返回结果中是非Promise类型数据
            //状态为成功,返回值为对象的成功值resolved
            // [[PromiseStatus]]:"resolved"
            // [[PromiseValue]]:123
            // return 123
            //2.如果...是Promise类型的数据
            //此Promise对象的状态决定上面Promise对象p的状态
            // return new Promise((resolve, reject) => {
            //     resolve("ok"); //resolve
            //     reject("ok"); //reject
            // });
            //3.抛出异常
            throw new Error("失败了!");
            //状态:reject
            //value:失败了
        }, reason => {
            console.error(reason);
        });
        //链式调用
        //then()里面的两个函数参数,可以只写一个
        p.then(value => {}, resolve => {}).then(value => {}, reason => {});
        console.log(result);
    </script>
</body>

</html>

运行结果:

Promise实践练习:

“回调地狱”方式写法:

//1.引入fs模块
const fs = require("fs");
//2.调用方法,读取文件
fs.readFile("G:/code/ES6/1.txt", (err, data1) => {
  fs.readFile("G:/code/ES6/2.txt", (err, data2) => {
    fs.readFile("G:/code/ES6/3.txt", (err, data3) => {
      let result = data1 + data2 + data3;
      console.log(result);
    });
  });
});

运行结果:

Promise实现:

//1.引入fs模块
const fs = require("fs");
//2.使用Promise实现
const p = new Promise((resolve, reject) => {
    fs.readFile("G:/code/ES6/1.txt", (err, data) => {
        resolve(data)
    });
}).then(value => {
    return new Promise((resolve, reject) => {
        fs.readFile("G:/code/ES6/2.txt", (err, data) => {
            resolve([value, data]);
        });
    })
}).then(value => {
    return new Promise((resolve, reject) => {
        fs.readFile("G:/code/ES6/3.txt", (err, data) => {
            //存入数组  
            value.push(data);
            resolve(value);
        });
    })
}).then(value => {
    console.log(value.join("\r\n"));
});

运行结果:

Promise对象的catch方法:

代码示例及相关说明:

<!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>Promise对象的cath方法</title>
  </head>
  
  <body>
    <script>
      //Promise对象的cath方法
      const p = new Promise((resolve, reject) => {
        setTimeout(() => {
          //设置p对象的状态失败,并设置失败的值
          reject("失败啦~!");
        }, 1000);
      });
      // p.then(value => {
      //     console.log(value);
      // }, reason => {
      //     console.warn(reason);
      // });
      p.catch(reason => {
        console.warn(reason);
      });
    </script>
  </body>
  
</html>

运行结果:

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表