promise 封装读取文件

  • Promise的参数是一个函数.
  • 每个Promise在实例化时,都会立即执行参数里的函
  1. const p = new Promise(()=>{

  2. console.log(1);

  3. })

  4. // 解释了上面的第2条

promise参数的参数

  • Promise的参数(函数),默认有2个参数(resolve,reject).译为:成功的回调、失败的回调
  • 每个Promise实例都可以通过.then方法传入,成功的回调和失败的回调


// 先假设拿到了数据
const p = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        const data = 'async resolve data';
        resolve(data);
    },1000);
});
 
// 使用异步得到的data,通过.then()方法传入回调函数
p.then((data)=>{
    console.log(data);
})

封装异步读取文件操作

  • fs.readFile()方法用于异步读取文件(node核心模块)
  • 将Promise的实例对象作为函数的返回值返回
  • 这样函数执行完毕后就得到一个Promise对象的实例,可以通过.then方法传入成功的回调和失败的回调


const fs = require('fs');
const path = require('path');
 
function asyncGetFileByPath(p) {
    return new Promise((resolve, reject) => {
        // Promise对象里面的参数,会立即执行(前面说过)
        fs.readFile(path.join(__dirname, p), 'utf-8', (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        })
    })
}
asyncGetFileByPath('./files/1.txt')
    .then(
        (data) => { // 成功的回调
            console.log(data);
        },
        (err) => { // 失败的回调
            console.error(err);
        }
    )

解决回调地域
前面已经成功的封装了一个读取文件的函数
下面用它来体验一下读取多个文件
我们在.then()方法中,第一个参数resolve()方法中,返回一个promise对象B.
那么在执行.then()的resolve()方法完毕后,此时的执行环境是这个Promise的实例b
可以通过b的.then()方法继续传入resolve取消回调地狱,让代码趋于扁平化


const fs = require('fs');
const path = require('path');
 
function asyncGetFileByPath(p) {
    return new Promise((resolve, reject) => {
        // Promise对象里面的参数,会立即执行(前面说过)
        fs.readFile(path.join(__dirname, p), 'utf-8', (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        })
    })
}
asyncGetFileByPath('./files/1.txt')
    .then(
        (data) => { // 成功的回调    '1.txt'
            console.log(data); // 打印出 1.txt 数据
            return asyncGetFileByPath('./files/2.txt')
        },
        (err) => { // 失败的回调
            console.error(err);
        }
    )
    .then( // 成功的回调  '2.txt'
        (data) => {
            console.log(data); // 打印出 2.txt 中的数据
            return asyncGetFileByPath('./files/3.txt') // 继续返回Promise对象的实例
        },
        (err) => {
            console.error(err);
        }
    )
    .then(
        (data) => { // 成功的回调 '3.txt'
            console.log(data); // 打印出 3.txt 中的数据
        },
        (err) => {
            console.error(err);
        }
    )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值