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

    举一个文件操作的例子,先创建3个txt文件, a.txt,b.txt.c.txt  内容分别为  aaaa,bbbbb,cccc`

    var fs = require('fs')
    
    //文件操作是异步的   执行顺序不一定是按顺序执行
    fs.readFile('./data/a.txt','utf8',function(err,data){
        if(err){
            //return console.log('读取失败')
            //抛出异常,阻止程序继续执行,把错误打印到控制台
            throw err;
        }
        console.log(data)
    })
    
    fs.readFile('./data/b.txt','utf8',function(err,data){
        if(err){
            //return console.log('读取失败')
            //抛出异常,阻止程序继续执行,把错误打印到控制台
            throw err;
        }
        console.log(data)
    })
    
    fs.readFile('./data/c.txt','utf8',function(err,data){
        if(err){
            //return console.log('读取失败')
            //抛出异常,阻止程序继续执行,把错误打印到控制台
            throw err;
        }
        console.log(data)
    })

    有时我们可能想要程序按照顺序执行

    var fs = require('fs')
    
    //在a回调函数种执行b,b的回调函数种执行c 这样就形成了多层嵌套,称为回调地狱
    fs.readFile('./data/a.txt','utf8',function(err,data){
        if(err){
            //return console.log('读取失败')
            //抛出异常,阻止程序继续执行,把错误打印到控制台
            throw err;
        }
        console.log(data)
        fs.readFile('./data/b.txt','utf8',function(err,data){
            if(err){
                //return console.log('读取失败')
                //抛出异常,阻止程序继续执行,把错误打印到控制台
                throw err;
            }
            console.log(data)
            fs.readFile('./data/c.txt','utf8',function(err,data){
                if(err){
                    //return console.log('读取失败')
                    //抛出异常,阻止程序继续执行,把错误打印到控制台
                    throw err;
                }
                console.log(data)
            })
        })
    })

    随之EcrameScript种出现了Promise这个api来解决这种回调嵌套的问题

    下面是一个Promise的一个简单案例

    //Promise是一个构造函数
    var fs = require('fs')
    
    /**
     * Promise容器中存放异步任务,有三个状态,
     * Pending(正在进行),
     * Resolved(成功)
     * Rejected(失败)
     * 执行结束只会有两种结果
     * Pending-->Resolved
     * Pending-->Rejected
     */
    
    //创建Promise容器 一旦创建就会执行里面的代码
    var p1 = new Promise(function(resolve,reject) {
        fs.readFile('./data/a.txt','utf8',function(err,data){
            if(err){
                reject('失败')
            }else{
                resolve(data) 
            }
        })
    })
    
    var p2 = new Promise(function(resolve,reject) {
        fs.readFile('./data/b.txt','utf8',function(err,data){
            if(err){
                reject('失败')
            }else{
                resolve(data) 
            }
        })
    })
    
    var p3 = new Promise(function(resolve,reject) {
        fs.readFile('./data/c.txt','utf8',function(err,data){
            if(err){
                reject('失败')
            }else{
                resolve(data) 
            }
        })
    })
    
    /*
        当p1执行成功的时候 当前函数种return的结果就可以在then的funtion中得到,
        也就是可以在then中的回调函数中得到
        return 123得到的就是123  没有return得到的就是undefined
        真正使用的话,我们是可以return一个Promise对象
        return 一个Promise对象时,后续的then中的第一个参数就是返回的Promise对象的resolve参数
    */
    p1.then(function(data){
        console.log(data);
        return p2
    },function(err){
        console.log(err);
    })
    .then(function(data){
        console.log(data);
        return p3
    })
    .then(function(data){
        console.log(data);
    })
  • 相关阅读:
    分享知识-快乐自己:Spring整合定时器
    自定义响应结构 AjaxResult()
    日期工具类 DateUtils(继承org.apache.commons.lang.time.DateUtils类)
    处理json的工具类({本类为处理json的工具类})
    单机版 RedisUtils({基本操作封装工具类})【三】
    单机版 JedisUtil({基本操作封装工具类})【二】
    单机版 RedisPoolUtil({基本操作封装工具类})【一】
    序列化工具类({对实体Bean进行序列化操作.},{将字节数组反序列化为实体Bean.})
    分享知识-快乐自己:遍历Map集合
    自己的新闻后台管理系统
  • 原文地址:https://www.cnblogs.com/a-small-lyf/p/10773644.html
Copyright © 2011-2022 走看看