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);
    })
  • 相关阅读:
    springboot 整合Elasticsearch
    SpringBoot 使用AOP记录接口访问日志
    Java8 Collectors类的静态工厂方法
    Java8 Stream流方法
    Java8 Lambda表达式
    Java通过行为参数化传递代码
    springboot使用SpringTask实现定时任务
    Cron表达式
    springboot整合swagger-ui
    springboot整合redis
  • 原文地址:https://www.cnblogs.com/a-small-lyf/p/10773644.html
Copyright © 2011-2022 走看看