zoukankan      html  css  js  c++  java
  • Promise 解决回调地狱问题

    const fs = require('fs');

    // fs.readFile('./1.txt', 'utf8', (err, restult1) => {
    //     console.log(restult1);
    //     fs.readFile('./2.txt', 'utf8', (err, result2) => {
    //         console.log(result2);
    //         fs.readFile('./3.txt', 'utf8', (err, result3) => {
    //             console.log(result3);
    //         })
    //     })
    // });

    function p1() {
        return new Promise((resolve, reject) => {
            fs.readFile('./1.txt', 'utf8', (err, result) => {
                resolve(result);
            })
        })
    }


    function p2() {
        return new Promise((resolve, reject) => {
            fs.readFile('./2.txt', 'utf8', (err, result) => {
                resolve(result);
            })
        })
    }


    function p3() {
        return new Promise((resolve, reject) => {
            fs.readFile('./3.txt', 'utf8', (err, result) => {
                resolve(result);
            })
        })
    }

    p1().then((r1) => {
            console.log(r1);
            return p2();
        })
        .then((r2) => {
            console.log(r2);
            return p3();
        }).then((r3) => {
            console.log(r3);
        });
     
     

    // 1 在普通函数定义的前面加上 async 关键字 普通函数就变成了异步函数
    // 2 异步函数默认的返回值是 promise 对象


    // await  关键字
    // 1 它只能出现在异步函数中
    // 2 await promise 它可以暂停异步函数的执行 等待 promise 对象返回结果后再向下执行
    // async function fn() {
    //     throw '发生错误';
    //     return 123;
    // }

    // // console.log(fn());
    // fn().then(function(data) {
    //     console.log(data); // 123 
    // }).catch(function(err) {
    //     console.log(err);
    // })


    async function p1() {
        return 'p1';
    }

    async function p2() {
        return 'p2';
    }

    async function p3() {
        return 'p3';
    }

    async function run() {
        let r1 = await p1();
        let r2 = await p2();
        let r3 = await p3();
        console.log(r1);
        console.log(r2);
        console.log(r3);
    }
    run();
     
     
     
    改良以后
    const fs = require('fs');
    //  promisify 改造现在异步函数 api, 让其返回promise 对象,从而 支持异步函数语法
    const promisify = require('util').promisify;
    const readFile = promisify(fs.readFile);

    async function run() {
        let r1 = await readFile('./1.txt', 'utf8');
        let r2 = await readFile('./2.txt', 'utf8');
        let r3 = await readFile('./3.txt', 'utf8');
        console.log(r1);
        console.log(r2);
        console.log(r3);
    }

    run();
  • 相关阅读:
    4种排序实践
    redis 应用场景和数据类型
    建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C
    分布式线程安全(redis、zookeeper、数据库)
    [专项]3道改错题
    kafka 业务埋点
    spring boot集成kafka
    kafka本地调试
    C语言 gets()和scanf()函数的区别
    EOF
  • 原文地址:https://www.cnblogs.com/ericblog1992/p/13086920.html
Copyright © 2011-2022 走看看