同步异步(概念/理解+回调函数+promise+generator+async/await+异步变同步)

本文深入探讨了同步与异步的概念,包括异步的非阻塞特性,以及同步的阻塞模式。文章介绍了回调函数、Promise、Generator和async/await的用法,帮助读者理解如何解决异步问题并实现异步到同步的转换。通过示例代码,阐述了如何利用async/await实现类似同步的代码执行顺序。
摘要由CSDN通过智能技术生成

异步和同步的概念

异步

  • 概念
    请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
    发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式
  • 模式
    非阻塞
  • 传输单位
    数据包
  • 举例
    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)<
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值