1.Promise出现的背景——回调地狱
我们在多次进行异步操作的时候会很难控制程序的进程,比如
fs.readFile(path1,'utf8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
});
fs.readFile(path2,'utf8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
});
fs.readFile(path3,'utf8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
});
fs.readFile(path4,'utf8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
});
在这种情况下我们就不可以很好的控制程序的进行,去使它按照我们预计的样子执行,这个时候我们可以使用回调函数来控制每一部分是按照我们预期的样子执行,但是回调函数过多会造成回调地狱,代码十分难看且难以维护,由此产生了promise。
2.Promise的基础使用
let fs=require('fs');
let p1=new Promise(function(resolve,reject){
fs.readFile('./TuBoWen','utf8',function(err,data){
if(err){
reject(err);
}else{
resolve(data);
}
});
});
p1.then(
//当promise异步操作成功执行的回调函数
function(data){
console.log(data);
},
//当promise异步操作执行失败的回调函数
function(err){
console.log('读取文件失败了',err);
}
)
3.封装Promise
let fs=require('fs');
function PromiseAPI(filePath){
return new Promise(function(resolve,reject){
fs.readFile(filePath,'utf8',function(err,data){
if(err){
reject(err);
}else{
resolve(data);
}
});
});
}
//尝试调用
PromiseAPI('./TuBoWen')
.then(function(data){
console.log(data);
},
function(err){
console.log(err);
})
4.用Promise封装Ajax
function PromiseAjax(url,callback){
return new Promise(function(resolve,reject){
let oReq=new XMLHttpRequest();
//当请求加载成功之后要调用指定的函数
oReq.onload=function(){
callback&&callback(JSON.parse(oReq.responseText))
resolve(JSON.parse(oReq.responseText));
}
oReq.onerror=function(){
reject(err);
}
oReq.open("get",url,true);
oReq.send();
})
}
5.结合MongoDB数据库使用Promise
一个简单的需求,查看数据库中是否有符合的数据,如果有,那么就打印“用户已存在”,否则在数据库中加入该用户。
User.findOne({
username:'TuBoWen'
})
.then(function(user){
if(user){
console.log('用户已存在')
}else{
return new User({
username:'TuBoWen',
password:'1376490336',
email:'1376490336@qq.com'
}).save()
}
})
.then(function(ret){
})