Promise介绍与基本使用
ES6引入的进行异步编程的新解决方案(备注:就方案使用回调函数)
具体表达:
- 从语法上来说:promise就是一个构造函数
- 从功能上来说:promise对象用来封装一个异步操作并可以获取其成功/失败的结果值
异步操作:
- fs 文件操作;
require('fs').readFile('./index.html',(err,data)=>{})
- 数据库操作;
- AJAX;
- 定时器
setTimeout(()=>{},2000)
什么要使用Promise
使用回调函数的方式更加灵活
旧的回调方式必须要在启动异步之前调用;
promise:启动异步操作=>返回promise对象=>给promise对象绑定回调函数(甚至可以在异步任务结束之后指定多个)
支持链式调用,解决回调地狱的问题
- 回调地狱就是嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件;
- 回调地狱不便于阅读,不便于异常处理;
- 解决方案就是promise链式调用
区别实例对象与函数对象
函数对象:将函数作为对象使用时,称为函数对象;
实例对象:new 函数产生的对象,简称为对象
总结:
点的左边:对象
()的左边:函数
两种类型的回调函数
同步回调
立即执行,完全执行完才结束,不会放到回调队列中
例子:数组便利相关的回调函数
const arr=[1,2,3]
arr.forEach(item=>{//同步执行回调函数
console.log('forEach callback()',item)
})
console.log('这个最后输出')
异步回调
不会立即执行,会放入回调队列中将来执行
例子:定时器回调,ajax回调,Promise的成功|失败的回调
setTimeout(()=>{
console.log('setTimeout callback')
},0)
console.log('这个先输出')
JS中的error处理
错误的类型
- Error:所有错误的父类型;
- ReferenceError:引用变量不存在,如:变量在使用前没定义
- TypeError:数据类型不正确的错误
let b=null
console.log(b.xxx)
- SyntaxError:语法错误
- RangeError:数据值不在其所允许的范围内
function fn(){
fn()
}
fn()
//栈的空间有限
错误处理
捕获错误:
希望错误不要成为断点,能够继续往下执行
try{
const e={}
e()
}catch(error){
console.log(error.message)
console.log(error.stack)
}
抛出错误:
function doThing(){
//当前时间为奇数就能正常干活,否则不能干活
const time=Date.now()
if(time%2==1){
console.log('当前时间为奇数,正常干活。。。')
}else{
//不能干活,且告诉调用者
throw new Error('当前时间为偶数。干不了'+time)
}
}
try{
doThing()
}catch(error){
alert(error.message)
}