Promise 异步编程

回调地狱
不能够保证异步编程的执行顺序,例如读取不同的文件
fs.readFile("a.txt",function(err,data){
if(err){
throw(err)
}
})
fs.readFile("b.txt",function(err,data){
if(err){
throw(err)
}
})
fs.readFile("c.txt",function(err,data){
if(err){
throw(err)
}
})
为了固定文件的读取顺序,可以在异步读取中进行嵌套
fs.readFile("a.txt",function(err,data){
if(err){
throw(err)
}
fs.readFile("b.txt",function(err,data){
if(err){
throw(err)
}
fs.readFile("a.txt",function(err,data){
if(err){
throw(err)
}
})
})
})
为了解决回调嵌套的问题,ES6中新增了promise API解决这个问题
var p1=new Promise(function(resolve,reject){
teacher1.save(function(err,data){
if(err){
reject(err)
}
resolve(data)
})
})
p1
.then(
function(){
var query=teacher_Col.where({name:"zpliu"})
query.deleteMany(function(err,data){
if(err){
console.log("删除失败"+err)
}
console.log("删除成功")
})}
)
具体实现
首先定义一个Promise对象,对象中的函数会立即执行,函数有两个回调函数用于接收执行程序中的结果或报错信息
resolve&reject
Promise对象使用then方法可以获取程序的执行结果并且进入下一个依赖的程序
then函数的参数都是可选的,即可以不看Promise对象的执行结果直接执行下一个程序,也可以给函数一个data参数,获取Promise对象执行成功后的数据
实例
1.使用函数进行封装
为了避免promise对象一被创建就进入执行状态,使用函数将promise对象封装在函数作用域;通过调用函数来执行promise
function getFileByPath(filepath){
return new Promise(function(resolve,reject){
fs.readFile(filepath, 'utf-8', (err,data)=>{
if(err){
return reject(err)
}
return resolve(data)
});
})
}
2.在promise实例对象中传入要执行的函数
函数带了两个回调函数,分别对应了成功的回调函数resolve与失败的回调函数reject
当要进行的操作成功或者失败时,将对应的函数与数据返回给Promise实例对象
Promise对象使用对应的then方法处理两个回调函数
3. 使用then方法进行promise串联
then 方法接受两个回调函数,成功的回调必须写而失败的回调可以不写
getFileByPath("./1.txt")
.then(function(data){
console.log(data);
return getFileByPath("./ID.txt")
})
.then(function(data){
console.log(data)
})
4.解决promise执行中出错的问题
1.出错之后继续异步执行
在then的第二个位置传递出错的回调函数,函数返回下一个promise
getFileByPath("./1.txt") .then(function(data){ console.log(data); return getFileByPath("./ID.txt") },function(err){ console.log(err) return getFileByPath("./ID.txt") })
2. 抛出错误,结束异步执行
使用catch捕获异常,传递异常处理函数
.catch(err=>{ console.log(err); })
3. 如果同时写了这两种处理方法的话,catch是不能够生效的
Last updated
Was this helpful?