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就可以
  • 相关阅读:
    prototype.js超强的javascript类库
    MySQL Server Architecture
    Know more about RBA redo block address
    MySQL无处不在
    利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
    LAMP Stack
    9i中DG remote archive可能导致Primary Database挂起
    Oracle数据库升级与补丁
    Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
    Oracle Ksplice如何工作?How does Ksplice work?
  • 原文地址:https://www.cnblogs.com/wenqiangit/p/9817493.html
Copyright © 2011-2022 走看看