symbol的使用场景就是给对象添加属性和方法,表示独一无二的值
symbol .后面的属性,都是symbol里面的属性,而他们作为一个整体,又作为我们对象的一个属性去设置,来改变对象在特定场景下的表现即拓展对象功能
因为是整体的函数传参(下面的图片)
生成器函数在异步任务中的表现:解决了回调地狱问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//模拟获取 用户数据 订单数据 商品数据
function getUsers(){
//定时器
setTimeout(()=>{
let data = '用户数据';
//调用next方法,并且将数据传入
//第二次调用next 所以它的实参data会作为第一个yield语句的返回结果users
iterator.next(data);
},1000);
}
function getOrder(){
setTimeout(()=>{
let data = '订单数据';
//第三次调用next 所以它的实参data会作为第二个yield语句的返回结果oeders
iterator.next(data);
},1000);
}
function getGoods(){
setTimeout(()=>{
let data = '商品数据';
//第四次调用next 所以它的实参data会作为第二个yield语句的返回结果goods
iterator.next(data);
},1000)
}
//生成器函数
function * gen(){
let users = yield getUsers();
let oeders = yield getOrder();
let goods = yield getGoods();
}
//调用生成器函数
let iterator = gen();
//第一次调用next
iterator.next();
</script>
</body>
</html>
then方法接收两个参数,且两个参数都是函数类型,并且每个函数都有一个形参,成功的函数形参一般叫value,失败的形参一般叫reason
如果调用的是resolve函数,调完之后promise的对象的状态就会变为成功,成功之后就会调用对象里面的then方法的第一个回调函数
如果在读取数据时发生了错误,就调用reject函数,调完之后promise的对象的状态就会变为失败,失败之后就会调用then方法的第二个回调函数
就可以在then方法的回调函数中嵌套异步任务