小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、Promise是什么?
promise是一个对象用于异步操作,它表示一个尚未完成且预计在未来完成的异步操作。
二、为什么要用Promise?
当我们发送异步请求时,如果第一次请求后还需要在第一次请求的前提下再次发出第二次请求,那么就会出现多层回调嵌套的现象。(回调地狱)
request('test1.html', '', function(data1) {
console.log('第一次请求成功, 这是返回的数据:', data1);
request('test2.html', data1, function (data2) {
console.log('第二次请求成功, 这是返回的数据:', data2);
request('test3.html', data2, function (data3) {
console.log('第三次请求成功, 这是返回的数据:', data3);
//request... 继续请求
}, function(error3) {
console.log('第三次请求失败, 这是失败信息:', error3);
});
}, function(error2) {
console.log('第二次请求失败, 这是失败信息:', error2);
});
}, function(error1) {
console.log('第一次请求失败, 这是失败信息:', error1);
});
这样看起来非常臃肿,有种晕头转向的感觉,不利于后期修改维护。而使用Promise,我们就可以利用then进行「链式回调」,将异步操作以同步操作的流程表示出来。
三、Promise基本用法
1.promise是一个对象,先输出一下Promise对象看看
const request = new Promise((resolve, reject) => {
});
console.log(request);
Promise对象下有很多的方法:
.then、.catch、.finally、.all、.race、.resolve、.reject
2.先来一个简单的实例了解一下这些方法是干什么的
<script>
var a = 1;
const request = new Promise((resolve, reject) => {
//这里面放执行异步操作的代码
if(a == 10){
resolve('success'); //resolve是异步操作执行成功后要执行的
}else{
reject('fali'); //reject是异步操作执行失败后执行的
}
});
request.then((res => {
console.log(res); //成功 resolve
})).catch((err => {
console.log(err); //失败 reject
})).finally((res => {
console.log('成功失败都调用');
}))
</script>
输出为:
new Promise中的两个参数是回调函数,resolve是成功后的回调,reject是失败后的回调。.then是成功时的回调,.catch是失败后的回调,.finally是成功失败都会执行。我们可以通过then进行「链式回调」:
Node实例:
const fs = require('fs');
function isExit() {
return new Promise((resolve, reject) => {
fs.stat('./hehe.js', (err, status) => {
if(err){
reject('文件不存在');
} else {
resolve('文件存在');
}
})
})
}
function delFile() {
return new Promise((resolve, reject) => {
fs.unlink('./hehe.js', (err) => {
if(err){
reject('删除失败');
} else {
resolve('删除成功');
}
})
})
}
isExit()
.then(() => {
//文件存在的操作
// throw new Error('手动抛出错误终止链式调用执行');
return delFile(); //这里一定要return返回一个新的promise对象才能继续.then
})
.then((msg) => {
//删除成功后的操作
console.log(msg); //删除成功
})
.catch((err) => {
console.log(err);
})
/*
链式调用 整个代码只需要一个.catch 只要.then中有一个出现错误就会走.catch
手动终止链式调用的执行: throw new Error('手动抛出错误终止链式调用执行');
*/