异步解决疑点+异步变同步+异步同步的区别和概念
异步和同步的概念
异步
- 概念
请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式 - 模式
非阻塞 - 传输单位
数据包 - 举例
callback、settimeout、ajax、回调函数、promise、then
同步
- 概念
提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式 - 模式
阻塞 - 传输单位
字符 - 举例
js(js是单线程的,虽然js是单线程的,但是浏览器的内核是多线程的,可以通过event loop将js同步变成异步)
判断函数的同步异步方法
- 在结果的前后都加一个console,如果打印的结果在console中间就是同步,结果在console的后面就是异步
异步解决的疑点
回调函数
- 概念
回调函数就是传递一个参数化的函数,就是将这个函数作为一个参数传到另一个主函数里面,当那一个主函数执行完之后,再执行传进去的作为参数的函数。走这个过程的参数化的函数 就叫做回调函数。换个说法也就是被作为参数传递到另一个函数(主函数)的那个函数就叫做 回调函数 - 执行回调函数的过程
1、主函数需要调用回调函数
2、中间函数登记回调函数
3、触发回调函数事件
4、调用回调函数
5、响应回调事件 - 理解
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
- 其他(apply、call)
apply:apply(this,[参数1,参数2…])
call:call(ths,参数1,参数2) - 代码说明
<script type="text/javascript">
function title(value){
//这是回调函数!!!!
alert(value);
}
function main(title, value){
//这个主函数:在参数列表中,title作为一个参数传递进来,也就是上文说的 参数化函数;然后value这个值正是title()函数中所需要的。
alert("我是主函数");
title(value);//结果为:'我是回调函数'。——————然后在这行这个title(),它就是回调函数咯。
}
main(title,"我是回调函数");//title参数加上()后,就会变回一个函数,并会被执行一次。
//PS:看清楚,调用的是main()函数,意味着先执行main(),这时已经执行了主函数,title()被main()在函数体中执行了一次,因此title()是回调函数。
</script>
promise
- 概念
(是es6新的函数体,核心是用同步的方法产生异步的效果)
Promise对象的状态有3个,分别是pending(进行中)、fulfilled(已完成)、rejected(已失败)。Promise对象一旦进入了某一个状态,就不会再转成其他状态了(主要是后面两种状态,fulfilled和rejected)。如一旦调用了resolve函数,就是fulfilled的状态,就不会再调用reject函数了。
1、pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。
2、fulfilled:满足状态,当我们回调了resolve函数时,就处于该状态。
3、rejected:拒绝状态,当我们回调了reject函数时,就处于该状态。 - 代码格式
promise
.then(function(data) {
// success
})
.catch(function(err) {
// error
});
- 举例说明
let p = new Promise((resolve, reject) => {
let a1 = '成功的参数';
let a2 = '失败的参数';
var time = setTimeout(() => {
console.log('start');
resolve(a1)<