1. 前言
- 总算有机会写下
promise
了, 之前写了篇promise基础,
- 这次从另外的角度引入
Promise
,说不定有新的收获
- 基础的概念就不在叙述了 看之前的文章promise基础就行
需求:读取一个文件,但是在函数外部访问读取的内容
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异步结果不管在任何时间,任何位置调用, 不管调用多少次, 总能拿到异步结果
参考资料
promise 应用
手写promise雏形
配合 async/await
初心
我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落
的崛起;
共勉
网友评论