主题
- 同步及异步概念
- 方块运动的实现
- promise的用法
- then的返还值
- Async 函数 和 await
目标
理解并学会使用promise使用方式以及async 、await的使用
1、同步异步概念
- 同步和异步:是一种消息通知机制
同步
做一件事,没有拿到结果之前,就一直在这等着,一直等到有结果了,再去做下边的事
- 同步阻塞
- A调用B,B处理获得结果,才返回给A。
- A在这个过程中,一直等待B的处理结果,
- 没有拿到结果之前,需要A(调用者)一直等待和确认调用结果是否返回,
- 拿到结果,然后继续往下执行。
异步
做一件事,不用等待事情的结果,然后就去忙别的了,有了结果,再通过状态来告诉我,或者通过回调函数来处理。
- 异步非阻塞:
- A调用B,无需等待B的结果,B通过状态,通知等来通知A或回调函数来处理。
2、异步处理方案
- 回调解决异步问题
- 缺点:通过回调函数来处理异步,容易造成回调地狱
- 回调地狱:函数作为参数层层嵌套。回调地狱会导致代码可读性及可维护性变差。
function move(ele,target,direction,cb) { let start = parseInt( getComputedStyle(ele,null)[direction]); let speed = 5*(target-start>0?1:-1); setTimeout(()=>{ start += speed; ele.style[direction] = start + "px"; if(Math.abs(target-start)<5){ // console.log("运动完成"); cb && cb(); }else{ move(ele,target,direction,cb) } },10) } let ele = document.querySelector(".box"); // move(ele,300,"top"); // move(ele,0,"left"); // move(ele,300,"top"); // 回调地狱 move(ele,300,"left",function () { move(ele,300,"top",function () { // console.log("运动完成"); move(ele,0,"left",function () { move(ele,0,"top",function () { console.log("所有运动完毕 "); }) }) }) });
- 缺点:通过回调函数来处理异步,容易造成回调地狱
3、自定义事件
- EventTarget类 - 事件类
- CustomEvent
<!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>
<style>
.box {
width: 100px;
height: 100px;
position: absolute;
left: 0;
top: 0;
background: red;
}
</style>
</head>
<body>
<div class="box"></div>
<script>
// 方块的运动 - 解决回调地域
let eventObj = new EventTarget();
let num = 1;
function move(ele, target, direction) {
let start = parseInt(getComputedStyle(ele, null)[direction]);
let speed = 5 * (target - start > 0 ? 1 : -1);
setTimeout(() => {
start += speed;
ele.style[direction] = start + "px";
if (Math.abs(target - start) < 5) {
// console.log("运动完成");
// cb && cb();
eventObj.dispatchEvent(new CustomEvent("myevent" + num));
num++;
} else {
move(ele, target, direction)
}
}, 10)
}
let ele = document.querySelector(".box");
move(ele,300,"left");
eventObj.addEventListener("myevent1",()=>{
console.log("运动完成11");
move(ele,300,"top");
})
eventObj.addEventListener("myevent2",()=>{
console.log("运动完成22");
move(ele,0,"left");
})
eventObj.addEventListener("myevent3",()=>{
console.log("运动完成333");
move(ele,0,"top");
})
eventObj.addEventListener("myevent4",()=>{
console.log("运动完成444");
})
</script>
</body>
</html>
3、方块运动实现
- 回调运动框架方块的运动
4、Promise对象的使用
Promise 对象
两种参数:
- then的2个参数;
- onresolove 和 onreject;
Promise对象 - 构造函数
ES6的Promise对象是一个构造函数,用来生成Promise实例的。
所谓Promise对象,就是代表了未来某个将要发生的事件(通常是一个异步操作)。
- 优点:将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数
Promise对象的三种状态
Promise对象的三种状态 pending 、resolve 和 reject
- then 方法
- then的返回值,会返回一个新的 Promise 对象, 但是状态会有几种情况:
- then 的回调函数中没有返回值,then就会返回一个状态为: resolved 的 promise 对象
- then 的回调函数返回值是 非 promise 的值, then就会返回一个状态为: resolved 的 promise 对象,另外会把返回值,传递给 下一个 then
- then 的回调函数返回值是 promise 对象,then 就直接返回这个 promise 对象,具体的状态可以由我们自己定义,具体传递的值,也由我们自己定义
Promise 下的方法:
- resolve
- reject
- all
- race
- finally
5、async&await - 改造promise
- Async 函数 和 await 改造promise;
- try及catch方法捕获错误