promise - 5.解决嵌套

需求:读取 name.txt 文件,拿到 name.txt 文件内的内容之后读取 age.txt
准备文件

  • name.txt
age.txt
  • age.txt
20岁
  1. 常规读取
let fs = require('fs')
function read(...args) {
    return new Promise((resolve, reject) => {
        fs.readFile(...args, function(err, data) {
            if(err) reject(err)
            resolve(data)
        })
    })
}
read('./name.txt', 'utf8').then(data => {
    return read(data, 'utf8')
}).then(data => {
    console.log(data);
})
  1. promise defer 解决嵌套方法一

promise.defer() 延迟对象,可以解决 promise 的嵌套问题,原生不支持

let fs = require('fs')
let promise = require('./promise_ku/promise')
function read(...args) {
    let dfd = promise.defer() // 延迟对象,可以解决 promise 的嵌套问题
    fs.readFile(...args, function(err, data) {
        if(err) dfd.reject(err)
        dfd.resolve(data)
    })
    return dfd.promise
}
read('./name.txt', 'utf8').then(data => {
    return read(data, 'utf8')
}).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err);
})
  1. promisify 解决嵌套方法二

promisify 是node 原生的方法

// let { promisify } = require('util') // 原生调用
function promisify(fn) { // 自定义 promisify 方法
    return function(...args) {
        return new Promise((resolve, reject) => {
            fn(...args, function(err, data) {
                if(err) reject(err)
                resolve(data)
            })
        })
    }
}
let readFile = promisify(fs.readFile)
readFile('./name.txt', 'utf8').then(data => {
    return readFile(data, 'utf8')
}).then(data => {
    console.log(data);
})

你可能感兴趣的:(JavaScript)