【es6笔记】es6的入门简介_Promise(6)

Page content

这里整理了Promise相关的内容。

<!DOCType html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
</head>

<body>
    <script>
        console.log("--------------Promise--------------");
        /*
        Promise是ES6引入的异步编程的新解决方案。IO相关的 文件fs, request, 数据库连接等等...
        Promise是一个构造函数。
        */
        // resolve 成功后调用 它会返回true,  reject 失败后调用 它会返回false
        const p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                let data = '数据库数据';
                resolve(data);
                // let err = '数据读取失败';
                //reject(err);
            }, 1000);
        });
        p.then(function (value) { // 成功后执行
            console.log(value);
        }, function (reason) { //失败后执行
            console.log('出错了:', reason);
        });

        {
            console.log('---------------------------');
            //创建promise对象
            const p1 = new Promise(function (resolve, reject) {
                setTimeout(()=>{
                    resolve('成功了');
                    reject('出错了');
                }, 1000);
            });

            //调用 then 方法的返回结果是Promise对象,由回调函数的结果决定
            //1.如果返回结果是非Promise对象,状态是成功,返回为对象成功的值
            const result = p1.then(function (value) {
                console.log('成功了:', value);
                // 不写 return 会返回undefined 等于成功。
                return new Promise((resolve,reject)=>{
                    resolve('ok'); //上层的Promise也是成功
                    //reject('err'); //上层的Promise也是失败
                })
            }, function (reason) {
                console.log('失败了:', reason);
            });

            //链式调用, 避免回调地狱
            p1.then(()=>{}).then(()=>{}).then();
            
        }
        console.log("---------Promise Ajax操作---------");
        /*
        //普通调用
        {
            //1.创建对象
            const xhr = new XMLHttpRequest();

            //2.初始化
            xhr.open("GET", "https://baidu.com");

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

            //4.绑定事件
            xhr.onreadystatechange = function () {
                //判断
                if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
                        console.log(xhr.response);
                    } else {
                        console.log(xhr.status);
                    }
                }
            }

        }

        //Promise
        {
            const p = new Promise(function (resolve, reject) {
                //1.创建对象
                const xhr = new XMLHttpRequest();

                //2.初始化
                xhr.open("GET", "https://baidu.com");

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

                //4.绑定事件
                xhr.onreadystatechange = function () {
                    //判断
                    if (xhr.readyState === 4) {
                        if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
                            resolve(xhr.response);
                        } else {
                            reject(xhr.status);
                        }
                    }
                }
            });

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

        }
        */

    </script>
</body>

</html>

练习

读取文件

const fs = require('fs');

fs.readFile('test.md', (err, data) => {
    if (err) throw err;
    console.log(data.toString());
});

const p = new Promise(function (resolve, reject) {
    fs.readFile('test.md', (err, data) => {
        if (err) reject(err);
        resolve(data);
    });
});

p.then(function (value) {
    console.log(value.toString());
}, function (reason) {
    console.log(reason);
});

连续读取文件

const fs = require('fs');

//普通读取文件
fs.readFile('test.md', (err, data1) => {
    fs.readFile('test1.md', (err, data2) => {
        fs.readFile('test2.md', (err, data3) => {
            let result = data1 + '\r\n' + data2 + '\r\n' + data3;
            console.log(result);
        });
    });
});

//使用Promise读取文件
const p = new Promise(function (resolve, reject) {
    fs.readFile('test.md', (err, data) => {
        if (err) reject(err);
        resolve(data);
    });
});

p.then(function (value) {
    return new Promise((resolve, reject) => {
        fs.readFile('test1.md', (err, data) => {
            if (err) reject(err);
            resolve([value, data]);
        });
    });
}, function (reason) {
    console.log(reason);
}).then(function (value) {
    return new Promise((resolve, reject) => {
        fs.readFile('test2.md', (err, data) => {
            if (err) reject(err);
            value.push(data);
            resolve(value);
        });
    });
}, function (reason) {
    console.log(reason);
}).then((value) => {
    console.log(value.join('\r\n'));
});

错误处理

//处理错误
const p1 = new Promise(function (resolve, reject) {
    setTimeout(() => {
        reject('出错了');
    })
});

p1.then(function (value) { }, function (reason) {
    console.log(reason);
});

//使用catch处理错误
const p2 = new Promise(function (resolve, reject) {
    setTimeout(() => {
        reject('出错了');
    })
});

p2.catch(function (reason) {
    console.log(reason);
})

欢迎大家的意见和交流

email: li_mingxie@163.com