• [js]promise学习2


    let fs = require("fs"),
        path = require('path');
    

    普通读取文件方法

    /*
    fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
        if (err) throw err;
        console.log(data);
    });
    console.log(111); //readFile是异步的,会先执行
    */
    
    //将读文件方法封装成函数return(因为readFile是异步的,不能用return)
    /*function readFile(fp) {
        fs.readFile(fp, 'utf8', (err, data) => {
            if (err) return err;
            return data;
        })
    }
    
    console.log(111);
    console.log(readFile(path.resolve('./data.json'))); //undefined*/
    

    利用回调解决获取数据问题

    /*function readFile(fp, callback) {
        fs.readFile(fp, 'utf8', (err, data) => {
            if (err) return callback(err);
            callback(null, data)
        })
    }
    
    readFile(path.resolve('./data.json'), (err, data) => {
        if (err) console.log(err.message);
        console.log(data)
    });
    console.log(111);*/
    

    分开写回调更明确点

    /*function readFile2(fp, succCb, errCb) {
        fs.readFile(fp, 'utf8', (err, data) => {
            if (err) return errCb(err);
            succCb(data)
        });
    }
    
    readFile2(path.resolve('./data1.json'), function succCb(data) {
        console.log(data);
    }, function errCb(err) {
        console.log('处理错误');
    });
    
    readFile2(path.resolve('./data.json'), function succCb(data) {
        console.log(data);
        readFile2(path.resolve('./data2.json'), function succCb(data) {
            console.log(data);
            readFile2(path.resolve('./data3.json'), function succCb(data) {
                console.log(data);
            });
        });
    });*/
    

    使用promise实现读文件

    /*
    var p = new Promise(function () {
        fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
            if (err) return err;
            console.log(data);
        })
    });
    
    //特点, new后立即执行excutor
    */
    

    如何不让立即执行: 放到函数里

    /*function readFile() {
        var p = new Promise(function () {
            fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
                if (err) throw err;
                console.log(data); //如何获取数据: 异步操作不能return
            })
        });
    }
    
    console.log(111);
    readFile();
    console.log(222);*/
    

    使用promise的reject和resolve返回数据

    /*
    function readFile() {
        var promise = new Promise(function (resolve, reject) {
            fs.readFile(path.resolve('./data1.json'), 'utf8', (err, data) => {
                if (err) return reject(err);
                resolve(data); //如何获取数据: 异步操作不能return
            })
        });
        return promise; //1,返回时var promise还并没有只系那个
    }
    
    var p = readFile();
    p.then(function (data) { //2,直到.then实例化了具体的resolve, reject函数后, 才去执行的var promise的内容.
        console.log(data);
    }, function (err) {
        console.log(err);
    
    });
    
    */
    
    //优化
    //1.取消return中间变量
    //2.调用tehn时候不必中间变量
    /*
    function readFile() {
        return new Promise(function (resolve, reject) {
            fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
                if (err) return reject(err);
                resolve(data); //如何获取数据: 异步操作不能return
            })
        });
        //1,返回时var promise还并没有只系那个
    }
    
    
    readFile().then(function (data) { //2,直到.then实例化了具体的resolve, reject函数后, 才去执行的var promise的内容.
        console.log(data);
    }, function (err) {
        console.log(err);
    });
    */
    
    function readFile(fp) {
        return new Promise(function (resolve, reject) {
            fs.readFile(path.resolve(fp), 'utf8', (err, data) => {
                if (err) return reject(err);
                resolve(data); //如何获取数据: 异步操作不能return
            })
        })
    }
    
    /*
    readFile('data.json').then(function (data) {
        console.log(data);
        readFile('data2.json').then(function (data) {
            console.log(data);
            readFile('data3.json').then(function (data) {
                console.log(data);
            });
        });
    });*/
    
    /*
    readFile('data.json').then(function (data) {
        console.log(data);
        11
        return readFile('data2.json'); //返回新的promise, 本次返回的promise对象, 被第二个.then()操作
    }).then(function (data) {
        console.log(data);
        return readFile('data3.json');
    }).then(function (data) {
        console.log(data);
    });
    
    console.log(111);*/
    

    默认情况,前面的promise错误,即终止promise, 后面的then不会执行

    情况1: 使用错误的回调解决这个问题: 前面执行失败了,不要印象后续promise正常运行.

    /*
    readFile('data11.json').then(function (data) {
        console.log(data);
        return readFile('data2.json'); //返回新的promise, 本次返回的promise对象, 被第二个.then()操作
    }, function (err) {
        console.log('失败1');
        return readFile('data2.json'); //返回新的promise,避免影响下一个
    }).then(function (data) {
        console.log(data);
        return readFile('data3.json');
    }, function (err) {
        console.log('失败2');
        return readFile('data3.json');
    }).then(function (data) {
        console.log(data);
    }, function (err) {
        console.log('失败3');
    });
    
    console.log(111);
    */
    

    情况2: 如果后面的promise依赖于前面的promise执行结果, 前面错了,后面就不必执行了

    //一旦保存,立即终止所有promise执行
    
    // cache的作用,如果前面的任何一个promise执行失败,则立即终止执行, 并进入cahce处理异常.
    readFile('data.json').then(function (data) {
        console.log(data);
        11
        return readFile('data22.json'); //返回新的promise, 本次返回的promise对象, 被第二个.then()操作
    }).then(function (data) {
        console.log(data);
        return readFile('data3.json');
    }).then(function (data) {
        console.log(data);
    }).catch(function (err) { //有1个错误,立即终止promise,2.进入cache处理
        console.log('自己的输出', err);
    });
    
    console.log(111);
    
  • 相关阅读:
    Matlab学习-(1)
    数据库事务是什么?
    Python解释器有哪些类型,有什么特点?
    Ajax向后台发送简单或复杂数据,后端获取数据的方法
    模态对话框被灰色阴影遮罩挡住的问题
    闭包
    Django——form表单
    Django中常用的正则表达式
    Django中装饰器的使用方法
    Django中自定义过滤器步骤
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/9792709.html
Copyright © 2020-2023  润新知