1. 前言
需求:读取一个文件,但是在函数外部访问读取的内容
2. 回调函数解决方案
- 解决问题的方式, 可以缩思考几种
- 使用回调函数来实现,因为
nodejs
里面大量的异步 是使用回调函数来实现的,给我们提供了解决问题的思路- 回调函数代码
function block2( callBack ){ fs.readFile("./01.txt", (err, data) => { if (err) return console.log("读取失败:", err); // callBack() 函数调用 就是去调用传过来的 函数 // 异步的结果放入回调函数 callBack(data) }); } // 参数是回调函数 block2( function(res){ console.log("1-------res:",res.toString()) } )
- 外部定义变量接收 读取结果,但是外部打印是 空,因为外部打印肯定先于异步读取里面的赋值操作先执行, 所以不行
let result = "" fs.readFile("./01.txt", (err, data) => { if (err) return console.log("读取失败:", err); console.log("读取成功-1:", data.toString()); result = data.toString() }); console.log("方案1----result---:",result);// 空的 原因 异步
- 简单的使用闭包也不行
// 函数外部访问函数内部的变量 函数内部 返回 函数的结果/函数本身 function block (){ fs.readFile("./01.txt", (err, data) => { if (err) return console.log("读取失败:", err); console.log("读取成功-2:", data.toString()); return data.toString() }); } console.log("方案2-----:",block()); //undefined
3. promise 解决 方案
- 这个需求重点在于:
异步
是不确定什么时候执行完成
的,但是完成了 必须自己必须知道
2.Promise
是异步编程的一种解决方案,比传统的解决方案更合理和更强大。- 从语法上说,Promise 是一个对象,从它可以获取异步
操作
的消息。Promise提供统一的API
,各种异步
操作都可以用同样的方法进行处- 语法演示
// 参数: 是回调函数 // 回调函数的参数: // 参数1: 函数 成功的回调 resolve() 成功 就传入数据 // 参数2: 函数 失败的回调 reject() 失败就传入 错误原因 let promise = new Promise( (resolve,reject)=>{ fs.readFile("./01.txt",(err,data)=>{ if(err) reject(err) else resolve(data) }) }) // then 传入一个成功的回调函数 resolve promise.then(res=>{ console.log("then----1",res.toString()) }) // catch 传入 一个失败回调 reject 修改不存在的路径来演示 promise.catch(error=>{ console.log("catch---error:",error) })
- 链式写法
// 连写 链式调用 因为 .then() 返回的也是一个 新的 promise 所以可以 N 多个 .then() fetch() promise.then(res=>{ console.log("连写---成功:",res.toString()) }).catch(err=>{ console.log("连写 失败:",err) })
- then()回调
可以有 2 个参数 一个成功回调,一个失败回调
promise.then( function(res){ console.log("成功过的回调:",res) }, function(err){ console.log("失败的回调:",err) } )
- 注意:
- 成功的回调函数resolve是必选的,必须在then中传入, 失败的回调函数reject是可选的, 可以省略
- then函数获取promise异步结果不管在任何时间,任何位置调用, 不管调用多少次, 总能拿到异步结果