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);
    })
  • 相关阅读:
    矩阵乘法(二):利用矩阵快速幂运算完成递推
    更改codeblock编译后程序的图标
    如何在VS2008下使用FLTK
    Python type() 函数
    Python range() 函数用法
    Python len()方法
    Python filter() 函数
    Python bool() 函数
    数据类型
    JAVA标识符
  • 原文地址:https://www.cnblogs.com/a-small-lyf/p/10773644.html
Copyright © 2011-2022 走看看