Promise 练习

这篇博客探讨了如何利用Promise来避免回调地狱问题。通过创建Promise实例并定义resolve和reject回调,然后使用.then()方法预设成功和失败的处理函数,实现了异步操作的流程控制。文章以读取多个文件为例,解释了Promise如何简化复杂的异步流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.demo目录
在这里插入图片描述
1.text ,2.text , 3.text;内容随意填;
2.test.js

const fs = require('fs')
const path = require('path')
 //封装的读文件方法;传路径;返回内容;
function getFileByPath(fpath, succCd, errcd) {
    fs.readFile(fpath, 'utf-8', (err, dataStr) => {//异步读取;需要懂回调;
        if (err) return errcd(err)//失败的回调
        // return dataStr 
        succCd(dataStr) //成功的回调;
    })
}
// 这里是调用一次试试;
 getFileByPath(path.join(__dirname, './file/2.text'),function (data) {
            console.log(data);
        },function (err) {
            console.log(err)
        });

需求:先读取文件1,在读取文件2,最后读取文件三;

	getFileByPath(path.join(__dirname, './file/1.text'), function (data) {
        console.log(data);
        getFileByPath(path.join(__dirname, './file/2.text'), function (data) {
            console.log(data);
            getFileByPath(path.join(__dirname, './file/3.text'), function (data) {
                console.log(data);
            }, function (err) {
                console.log(err)
            });
        }, function (err) {
            console.log(err)
        });
    }, function (err) {
        console.log(err)
    }); 

思考:如果有很多文件要读;就属于回调地狱–可用es6中promise解决回调地狱问题-------
promise的本质是;单纯的解决回调地狱的问题,并不能减少代码量;

1.promise是一个构造函数;需要 new Promise()得到一个实例对象;
2.在promise上,有两个函数;分别是resolve(成功之后的回调)和reject(失败之后的回调)
3.在promise构造函数prototype属性上;有一个 .then() 方法;也就是说,只要是promise构造函数创建的实例,都可以访问
.then()方法
4. promise表示一个异步操作;每当我们new 一个promise 的实例;这个实例,就表示一个具体的异步操作;
5. 既然promise创建的实例,是一个异步操作,那么,这个异步操作的结果;只能有两种状态;
5.1 状态1:成功(resolve)
5.2 状态2:失败(reject)
5.3 promise的实例;是一个异步操作;所以,内部拿到的操作结果后,无法使用return 返回给调用者,这个
时候使用回调函数的形式;把成功或者失败的回调返回给调用者;
6. 我们可以再new 出来的promise 实例上,调用.then()方法,【预先】为这个promise异步处理操作;指定成功和失败的回调函数;

	// 创建promise对象;创建一个异步操作的;
    // 需求先读取文件1,在读取文件2,最后读取文件三;
    // 每当new 一个promise实例的时候,就会立即执行这个异步操作中的代码;也就是说。new的时候,
    //除了能得到一个promise实例之外还会立即调用(!!!!!)
    // promise构造函数传递的那个function

    var promise = new Promise(function () {
        // 这个function内部写的是具体的异步操作;
        //读取文件1.text
        fs.readFile(path.join(__dirname, './file/1.text'), 'utf-8', (err, dataStr) => {
            if (err) throw err;
            console.log(dataStr)
        })
    })

如果需要;想调用的时候执行;就要用function包裹起来; 当调用方法的时候才开始读去文件;

function GetFileByPath(fpath) {
    return new Promise(function (resolve,reject) {
        // 这个function内部写的是具体的异步操作;
        //读取文件1.text
        fs.readFile(path.join(__dirname, fpath), 'utf-8', (err, dataStr) => {

            if(err) return reject(err)
            resolve(dataStr)

        })
    })
}

GetFileByPath('./file/1.text')
    .then(function (data) {
        console.log(data)//读取文件1.text;
        return GetFileByPath('./file/2.text')
        //这里return出去一个新的promise对象;可以再.then()后边继续.then();
       
    }, function (err) {
        // 失败的function可以省略不写;
    })
    .then(function (data) {//这里.then()是上一步操作中返回的promise
        console.log(data) 
        return GetFileByPath('./file/3.text')
    })
    .then(function (data) {
        console.log(data)
    })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值