Promise
回调函数的使用
对于异步操作的结果,我们无法获取到,通常使用回调函数来处理

Prosmise的本质
在异步操作中,经常要用到回调函数,因为异步操作使用return并不能及时返回我们想要的结果,但是大量使用回调函数会引起回调地狱问题,是的代码能以维护和理解
```
const path = require('path')
const fs = require('fs')
function getFileByPath(fpath,callback) {
fs.readFile(fpath,'utf-8',(err,dataStr)=>{
if (err) throw err;
callback(dataStr)
})
}
getFileByPath(path.join(__dirname,'./file/1.txt'),(data)=>{
console.log(data);
getFileByPath(path.join(__dirname,'./file/2.txt'),(data)=>{
console.log(data);
getFileByPath(path.join(__dirname,'./file/3.txt'),(data)=>{
console.log(data);
})
})
})
```
Promise是单纯的为了解决回调地狱问题,并不能帮我们减少代码量
Promise的概念介绍
- 1.Promise是一个构造函数,可以通过new Promise()得到一个promise实例
- 2.promise有两个方法,分别是resolve(成功后的回调函数)和reject(失败之后的回调函数)
- 3.promise的prototype属性上,有一个.then()方法,promise实例都可以访问.then()方法
- 4.Promise表示一个异步操作,一个promise实例就表示一个具体的异步操作
- 5.因为promis是一个异步操作,所以内部拿到操作结果后,无法使用return把操作的结构返回给调用者,只能通过回调函数把结果返回给调用者,异步操作的结果只有两种状态,成功或者失败,成功用resolve回调函数,失败用reject回调函数
- 6.我们在promise实例上,调用.then()方法,预先为promise异步操作,指定成功或失败的回调函数
形式上的和具体的Promise异步操作
var promise = new Promise() // 这个new出来的实例就是形式上的异步操作:我们只知道这是一个异步操作,但是做什么具体的异步事情,还不知道
var promise = new Promise(function() {}) // 这个function内部写的就是具体的异步操作
promise实例创建就会执行
```
//因为promise实例创建就会执行,所以我们通常将它包裹在一个函数中,通过具体需求调用函数来执行
const path = require('path')
const fs = require('fs')
function getFilebyPath(fpath) {
var promise = new Promise(function() {
fs.readFile(fpath,'utf-8',(err,dataStr) => {
if( err ) throw err;
console.log(dataStr);
});
});
}
getFilebyPath('./file/1.txt');
```
promise的执行过程
- getFilebyPath函数调用
- 去到函数定义的内部,先创建promise实例
- 函数定义的内部返回promise对象实例
- getFilebyPath函数调用处使用.then()方法预先绑定resolve和reject方法
- readFile异步处理是调用resolve和reject方法

promise解决回调地狱问题

promise异常处理的两种情况
- 前面的promise处理失败,但不影响后面的异常处理
![]()
- 前面的promise处理失败,后续promise不必处理
![]()


浙公网安备 33010602011771号