概念:
- Promise 是一个构造函数,既然是构造函数,就可以
new promise()
一个 promise 实例 - Promise 内置
reslove
和reject
两个函数,分别是成功的回调
和失败的回调函数
- 在 Promise 的
Prototype
属性上,有个.then
方法,只要是Promise 的实例,都可以调用.then
方法 - Promise 是一个异步操作,new 出的实例也是异步操作,异步操作只有两种结果:
状态1:成功
:在内部调用成功的回调函数reslove
,将成功结果返回给调用者
状态2:失败
:在内部调用失败的回调函数reject
,将失败返回给调用者 - 我们可以在实例上,调用
.then()
方法,【预先】为Promise指定,成功、失败的回调函数
使用:
这里写了一个简单的 读取txt内容的demo:
- 第一步:在内存中存入
read()
函数 - 第二步:程序往下走 调用
read('./read.txt')
,进入read()
函数体内 - 第三部:定义并且新
new Promise
实例对象,瞬间返回了promise
对象 给p
- 第四步:执行
p.then()
,传入成功
和失败
的回调的操作代码 - 第五步:
Promise
得到(reslove,reject)
两个函数参数,执行Promise
内部的函数,
// 使用 Promise 方法阅读一个txt 文件
const fs=require('fs')
function read(fpath){
var promise=new Promise(function(reslove,reject){
//此处 reslove 和 reject 是形参
fs.readFile(fpath,'utf-8',(err,datastr)=>{
if(err) return reject(err);
reslove(datastr);
})
})
return promise;
}
//传入 seslove 和 reject 的方法
var p=read('./read.txt');
p.then((result) => {
console.log(result);
}).catch((err) => {
console.log(err);
});
上代码可以简化:
function read(fpath){
return promise=new Promise(function(reslove,reject){
//此处 reslove 和 reject 是形参
fs.readFile(fpath,'utf-8',(err,datastr)=>{
if(err) return reject(err);
reslove(datastr);
})
})
}
//传入 seslove 和 reject 的方法
read('./read.txt').then((result) => {
console.log(result);
}).catch((err) => {
console.log(err);
});
使用 Promise 来解决回调地狱的问题:
// 使用 Promise 方法阅读一个txt 文件
const fs=require('fs')
function read(fpath){
return promise=new Promise(function(reslove,reject){
//此处 reslove 和 reject 是形参
fs.readFile(fpath,'utf-8',(err,datastr)=>{
if(err) return reject(err);
reslove(datastr);
})
})
}
//传入 seslove 和 reject 的方法
read('./read.txt')
.then((result) => {
console.log(result);
//读取文件1
return read('./read.1.txt')
})
.then((result)=>{
console.log(result);
// 读取文件2
return read('./read.2.txt')
})
.then((result)=>{
console.log(result);
})
捕获异常的方式:
我们有两种处理异常的方式:
- 第一:前面
promise
执行失败,不影响后面执行,我们单独为每个promise
指定,失败的回调函数 - 第二:如果
promise
执行失败,立即停止后续执行,在程序尾部, 添加.catch(){func(erro)}
- 第一种方式很简不举例,直接第二种,也是最常见
//传入 seslove 和 reject 的方法
read('./read.txt')
.then((result) => {
console.log(result);
return read('./read.1.txt')
})
.then((result)=>{
console.log(result);
// 读取文件2
return read('./read.22.txt')
})
.then((result)=>{
console.log(result);
})
.catch((err)=>{
console.log('读取失败拉'+err.message);
})