• 前端基础之《ECMAScript 6(8)—Promise》


    一、什么是Promise

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

    二、Promise基本语法

    1、Promise接收一个函数类型的参数。这个函数有两个入参。入参名字可以叫resolve和reject。

    2、把异步函数封装在Promise对象中,成功调用resolve(),失败调用reject()。

    1. //实例化 Promise 对象
    2. const p = new Promise(function(resolve, reject){
    3. setTimeout(function(){
    4. //模拟获取数据
    5. let data = '数据库中的用户数据';
    6. //调用resolve
    7. resolve(data);
    8. //调用后p的状态会变成成功
    9. }, 1000);
    10. });
    11. //调用 Promise 对象的 then 方法
    12. p.then(function(value){ //它有两个形参,成功的形参叫value
    13. //当你调用resolve(),Promise对象状态为成功时,调用第一个函数
    14. console.log(value);
    15. }, function(reason){ //失败的形参叫reason
    16. //如果调用reject(),Promise对象状态为失败,调用第二个函数
    17. console.error(reason);
    18. });

    一秒钟后,控制台打印:数据库中的用户数据

    3、Promise构造函数:Promise(excutor){}

    4、Promise.prototype.then方法

    5、Promise.prototype.catch方法

    三、Promise读取文件

    1、例子使用了nodejs的fs库

    Promise读取文件.js

    1. //1. 引入 fs 模块
    2. const fs = require('fs');
    3. //2. 调用方法读取文件
    4. // fs.readFile('./let关键字.html', (err, data) => {
    5. // //如果失败,则抛出错误
    6. // if(err) throw err;
    7. // //如果没有出错,则输出内容
    8. // console.log(data.toString());
    9. // });
    10. //3. 使用Promise封装
    11. const p = new Promise(function(resolve, reject){
    12. fs.readFile('./let关键字.html', (err, data) => {
    13. //判断如果失败
    14. if (err) reject(err);
    15. //如果成功
    16. resolve(data);
    17. });
    18. })
    19. p.then(function(value){
    20. console.log(value.toString());
    21. }, function(reason){
    22. console.log("读取失败!");
    23. });

    执行:
    D:\workspace-vscode\ECMAScript6> node .\Promise读取文件.js

    2、要是有多个异步任务,代码要不断的往里面缩进,但是使用Promise就不会。

    四、Promise封装ajax请求

    1、接口地址:https://api.apiopen.top/api/sentences

    1. const p = new Promise((resolve, reject)=>{
    2. //1. 创建对象
    3. const xhr = new XMLHttpRequest();
    4. //2. 初始化
    5. xhr.open("GET", "https://api.apiopen.top/api/sentences");
    6. //3. 发送
    7. xhr.send();
    8. //4. 绑定事件,处理响应结果
    9. xhr.onreadystatechange = function(){
    10. //判断
    11. if(xhr.readyState === 4){
    12. //判断响应状态码
    13. if(xhr.status >= 200 && xhr.status <300){
    14. //表示成功
    15. //console.log(xhr.response);
    16. resolve(xhr.response);
    17. }else{
    18. //如果失败
    19. //console.error(xhr.status);
    20. reject(xhr.status);
    21. }
    22. }
    23. }
    24. });
    25. //指定回调
    26. p.then(function(value){
    27. console.log(value);
    28. }, function(reason){
    29. console.error(reason);
    30. });

    Promise把调用和数据处理分开来了,代码更简洁。

    五、Promise.prototype.then方法

    1、如果回调函数中返回的结果是非 Promise 类型的属性,则返回对象状态为成功,对象的值为返回值。

    1. //创建 Promise 对象
    2. const p = new Promise((resolve, reject)=>{
    3. setTimeout(()=>{
    4. resolve('用户数据');
    5. }, 1000);
    6. });
    7. //调用 then 方法,两个回调函数
    8. const result = p.then(value=>{
    9. console.log(value);
    10. return 123;
    11. }, reason=>{
    12. console.warn(reason);
    13. });
    14. //then 方法的返回结果是 Promise 对象,对象状态是由回调函数的执行结果决定的
    15. console.log(result);

    2、状态

    pending:初始状态,不是成功或失败状态。
    fulfilled:意味着操作成功完成。
    rejected:意味着操作失败。

    3、如果回调函数返回的是 Promise 对象,则 then 方法返回的就是这个对象。

    4、then链式调用

    p.then(value=>{}, reason=>{}).then(value=>{}, reason=>{});

    链式调用,可以避免回调地狱的现象。

    六、Promise读取多个文件,解决回调地狱现象

    1、挨个读取三个文件内容,将读的内容合在一起输出

    1. //1. 引入 fs 模块
    2. const fs = require("fs");
    3. //回调地狱方式实现
    4. // fs.readFile('./let关键字.html', (err1, data1)=>{
    5. // fs.readFile('./const关键字.html', (err2, data2)=>{
    6. // fs.readFile('./let关键字实例.html', (err3, data3)=>{
    7. // let result = data1 + + '\r\n' + data2 + '\r\n' + data3;
    8. // console.log(result);
    9. // });
    10. // });
    11. // });
    12. //使用 Promise 实现
    13. //读取第一个文件
    14. const p = new Promise((resolve, reason)=>{
    15. fs.readFile('./let关键字.html', (err1, data1)=>{
    16. //成功
    17. resolve(data1);
    18. });
    19. });
    20. //第一个Promise的回调
    21. p.then(value=>{
    22. //返回一个新的Promise读取第二个文件
    23. return new Promise((resolve, reject)=>{
    24. fs.readFile("./const关键字.html", (err, data2)=>{
    25. //成功
    26. resolve([value, data2]); //value是读第一个文件的返回,data2是读第二个文件的返回
    27. });
    28. });
    29. }).then(value=>{
    30. return new Promise((resolve, reject)=>{
    31. fs.readFile("./let关键字实例.html", (err, data3)=>{
    32. //成功
    33. value.push(data3); //压入
    34. resolve(value); //value是三个文件的返回结果的数组
    35. });
    36. });
    37. }).then(value=>{
    38. console.log(value.join('\r\n'));
    39. });

    七、Promise的catch方法

    1、catch方法

    用来指定Promise对象失败的一个回调。

    1. DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Promise的catch方法title>
    6. <style>
    7. style>
    8. head>
    9. <body>
    10. <h1 id="hid" class="hcls"><span>testspan>h1>
    11. body>
    12. <script>
    13. const p = new Promise((resolve, reject)=>{
    14. //模拟操作
    15. setTimeout(()=>{
    16. //设置p对象的状态为失败,并设置失败的值
    17. reject("出错啦!");
    18. }, 1000);
    19. });
    20. // p.then(value=>{}, reason=>{
    21. // console.error(reason);
    22. // });
    23. //catch只回调状态失败时的回调方法
    24. p.catch(reason=>{
    25. console.warn(reason);
    26. });
    27. script>
    28. html>

  • 相关阅读:
    DHT11温湿度传感器驱动程序
    mac使用VMware Fusion安装Centos 7系统
    Java 异步编程 (5 种异步实现方式详解)
    Python-列表简介
    CSS基础篇---01选择器、字体与文本样式
    SpringBoot整合阿里云OSS文件存储解决方案
    【Shell篇一】操作系统、内核、Shell、Shell脚本
    【Java List与数组】List<T>数组和数组List<T>的区别(124)
    数据源作用以及spring配置数据源
    Java实用的DateUtils时间工具类介绍
  • 原文地址:https://blog.csdn.net/csj50/article/details/127442683