ES6之Promise

一、Promise是什么?

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

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

二、使用案例

1.Promise基本语法

<script>
        //实例化Promise对象
        const p = new Promise(function(resolve,reject){
            setTimeout(function(){
                //数据读取成功
                // let data = '数据库中的用户数据';
                // resolve
                // resolve(data); //通过调用resolve函数设置p的状态为成功

                //数据读取失败
                let err='数据读取失败';
                reject(err); //通过调用reject函数设置p的状态为失败
            },1000);
        });
        //调用 promise 对象的then方法
        p.then(function(value){
            console.log(value);
        },function(reason){
            console.log(reason);
        })
    </script>

2.Promise读取文件

// 什么是fs模块 ==> File System

// fs模块是Node.js的一个核心模块,专门用来操作系统中的文件,
// 常用的操作方式是对文件的读取和写入使用require('fs')载入fs模块,
// 模块中所有方法都有同步和异步两种形式。
// 异步方法中回调函数的第一个参数总是留给异常参数(exception),
// 如果方法成功完成,该参数为null或undefined。异步写法demo:有一个回调函数。

// fs.readFile(文件路径,options,回调函数)

// 异步的读取指定路径的文件,回调函数在读取文件完成后触发

//1.引入 fs 模块
const fs = require('fs');

//2. 调用方法读取文件
// fs.readFile('./resourses/为学.md',(err,data)=>{
//     //如果失败,则抛出错误
//     if(err) throw err;
//     //如果没有出错,则输出内容
//     console.log(data.toString());
// });

// 3. 通过Promise封装
const p = new Promise(function(resolve,reject){
    fs.readFile('./resources/为学.md',(err,data)=>{
        //如果失败
        if(err) reject(err);
        //如果成功
        resolve(data);
    });
});

p.then(function(value){
    console.log(value.toString());
},function(reason){
    console.log("读取失败!");
});

3.Promise封装AJAX

<script>
        //接口地址: https://api.apiopen.top/api/sentences

        const p = new Promise((resolve,reject)=>{

            //1.创建对象
            const xhr = new XMLHttpRequest();

            //2.初始化
            xhr.open("GET","https://api.apiopen.top/api/sentences");

            //3.发送
            xhr.send();

            //4.绑定事件,处理响应结果
            xhr.onreadystatechange = function(){
                //判断
                if(xhr.readyState === 4){
                    //判断响应状态码 200-299
                    if(xhr.status>=200 && xhr.status < 300 ){
                        //表示成功
                       resolve(xhr.response);
                    }else{
                        //如果失败
                        reject(xhr.status);
                    }
                }
            }
        });
        // 指定回调
        p.then(function(value){
            console.log(value.toString());
        },function(reason){
            console.log("读取失败!");
        });
    </script>

4.Promise-then方法

<script>
        //创建promise对象
        const p  = new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve('用户数据');
                // reject('出错啦');
            },1000)
        });
        //调用 then 方法 then方法的返回结果是 Promise对象,对象状态由回调函数的执行结果决定
        // 1. 如果回调函数中返回的结果是 非promise 类型的属性,状态为成功,返回值为对象的成功的值
        const result= p.then(value =>{
            console.log(value);
            return '123';
        },reason =>{
            console.warn(reason);
        });

        console.log(result);
    </script>

5.Promise-catch方法

<script>
        const p = new Promise((resolve,reject)=>{
            setTimeout(()=>{
                //设置p对象的状态为失败,并设置失败的值
                reject("出错啦");
            },1000)
        });

        // p.then(function(value){},function(reason){
        //     console.error(reason);
        // });

        p.catch(function(reason){
            console.warn(reason);
        });
    </script>

总结

学习记录所用,如有错误,欢迎讨论指正!