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就可以
原文地址:https://www.cnblogs.com/wenqiangit/p/9817493.html