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);
    })
  • 相关阅读:
    python自定义编写有关用户登录注册程序代码
    项目经理多年的经验之谈
    Linux虚拟机克隆后,启动系统发现网卡无法启动
    mysql出现服务器异常后,重启服务器后无法开启数据库处理方法
    计算机毕业四年,我都做了什么?
    个人Blog(采用Django+uwsgi+nginx)里面包含很多技术文章
    Delphi to C# Equivalancesdelphi和C#类似的地方
    Javascript浏览器关于scrollLeft,scrollTop的兼容性
    Mozilla Firefox15怎么样才能把标签页弄到下面去,就和360的一样,Mozilla Firefox15没有取消标签置顶这个选项……
    Delphi过程函数传递参数的几种方式
  • 原文地址:https://www.cnblogs.com/a-small-lyf/p/10773644.html
Copyright © 2011-2022 走看看