zoukankan      html  css  js  c++  java
  • Promise个人笔记---【Promise的前世今生】

    Promise第一版本

    案例是使用Node.js内置的fs模块[就是文件系统模块,负责读写文件。]来模拟异步操作

    const fs = require('fs');
    function getFilePath(fpath) {
        let p = new Promise(function (resolve, reject) {
            fs.readFile(fpath, 'utf-8', (err, dataStr) => {
                if (err) return reject(err)
                resolve(dataStr)
            })
    
        });
        return p
    
    }
    
    let p = getFilePath('./src/main.js');
    p.then(
        function (data) {
            console.log('-----------------' +data + '---------------')
        },
        function (err) {
            console.log(err.message)
    
        })
    

    Promise 第二版本

    const fs = require('fs');
    function getFilePath(fpath) {
        return new Promise(
            function (resolve, reject) {
                fs.readFile(fpath, 'utf-8', (err, dataStr) => {
                    if (err) return reject(err)
                    resolve(dataStr)
                })
            }
        )
    
    }
    
    getFilePath('./src/main.js')
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
            },
            function (err) {
                console.log(err.message)
            }
        )
    

    新的需求: 依次读取 1.txt --> 2.txt --> 3.txt

    第一版

    const fs = require('fs');
    function getFilePath(fpath) {
        return new Promise(
            function (resolve, reject) {
                fs.readFile(fpath, 'utf-8', (err, dataStr) => {
                    if (err) return reject(err)
                    resolve(dataStr)
                })
            }
        )
    
    }
    
    getFilePath('./1.txt')
        .then(function (data) {
            console.log('-----------------' + data + '---------------')
    
            getFilePath('./2.txt')
                .then(function (data) {
                    console.log('-----------------' + data + '---------------')
    
                    getFilePath('./3.txt')
                        .then(function (data) {
                            console.log('-----------------' + data + '---------------')
    
                        })
    
                })
        })
    

    第二版

    const fs = require('fs');
    function getFilePath(fpath) {
        return new Promise(
            function (resolve, reject) {
                fs.readFile(fpath, 'utf-8', (err, dataStr) => {
                    if (err) return reject(err)
                    resolve(dataStr)
                })
            }
        )
    
    }
    
    getFilePath('./1.txt')
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
                return getFilePath('./2.txt')
            })
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
                return getFilePath('./3.txt')
            })
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
            })
    

    新需求 捕获过程中的错误 不影响后面的Promise正常执行

    const fs = require('fs');
    function getFilePath(fpath) {
        return new Promise(
            function (resolve, reject) {
                fs.readFile(fpath, 'utf-8', (err, dataStr) => {
                    if (err) return reject(err);
                    resolve(dataStr)
                })
            }
        )
    
    }
    
    getFilePath('./没有这个文件.txt')
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
                return getFilePath('./2.txt')
    
            }, function (err) {
                console.log(err.message)
                return getFilePath('./2.txt')
            })
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
                return getFilePath('./3.txt')
            })
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
            })
    

    新需求 后面的执行以来前面的结果,当前面失败立即终止,并捕获错误

    const fs = require('fs');
    function getFilePath(fpath) {
        return new Promise(
            function (resolve, reject) {
                fs.readFile(fpath, 'utf-8', (err, dataStr) => {
                    if (err) return reject(err);
                    resolve(dataStr)
                })
            }
        )
    
    }
    
    getFilePath('./1.txt')
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
                return getFilePath('./2.txt')
    
            })
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
                return getFilePath('./22.txt')
            })
        .then(
            function (data) {
                console.log('-----------------' + data + '---------------')
                return getFilePath('./3.txt')
            })
        .catch(function (err) {
            console.log('【自己】捕获到的错误'+ err.message)
        })
    

    上面那样写不太优雅,来个终极版

    const fs = require('fs');
    
    function getFilePath(fpath) {
        return new Promise(
            function (resolve, reject) {
                fs.readFile(fpath, 'utf-8', (err, dataStr) => {
                    if (err) return reject(err);
                    resolve(dataStr)
                })
            }
        )
    
    }
    
    Promise.all([getFilePath('./1.txt'), getFilePath('./不存在.txt'), getFilePath('./1.txt')])
        .then(datas => {
            console.log(datas);
        })
        .catch(err => {
            console.log(err)
        })
    

    小结:

    • Vue中的vue-resource(官方已经不推荐使用)和axios都是基于Promise的,完全继承了Promise的特性,看过文档后分分钟可以上手
    • axios中的http请求实现不需要在自己写逻辑了 ,直接调用它的api就可以
  • 相关阅读:
    [杂题笔记]2021.08.18-2021.09.03,CF#741 Div.2&CF#736 Div.2&CF Global Round15&CF#739 Div3
    第一次博客作业
    《博弈论》
    迭代法-二分迭代求解低阶线性方程
    迭代法-牛顿迭代法
    logback扩展日志输出功能
    log4j2扩展日志输出功能
    c# clr创建mssql的存储过程、函数
    驰骋BPM,工作流
    Docker部署RocketMQ踩坑记录
  • 原文地址:https://www.cnblogs.com/wenqiangit/p/9817493.html
Copyright © 2011-2022 走看看