前端中异步同步的概念与实操

概念问题之什么是异步同步

当我们在开发需求时,碰到网络有延迟的情况,一般会是什么情况?

比如我们有一个获取首页数据的页面,正常情况下,用户在首页看到了一屏幕的商品信息。
但是由于网络延迟,当我发出获取数据的网络请求时,服务器没有及时给我消息。
这时候常常会显示loading,然后在服务器回复到商品信息时,再更新出来商品信息。

而同步异步的区别在于,在loading的期间,用户还能不能操作别的。

因为JS是一个单线程的语言,所以同一时间里只能做一件事情,如果采用同步的方式,在你发送请求后,你会一直处于卡死并且等待服务器操作的状态,这期间用户什么都做不了,甚至loading的动画都有可能不转圈了。

而采用异步的方式,发送请求后,释放了线程的资源,等到服务器回应的时候,会通知原来的程序,你的请求好了,你可以处理你原来需要处理的事情了,这时系统再放下当前线程需要做的事情,去将获取到的商品信息渲染出来。

用通俗点的例子来讲就是:

你去店里买衣服,你告诉店员你想要哪一件,店员说没有货了,同步就是你在店里等着,等到有货你拿走。异步就是,店员记住你的电话号码,让你先回家,等有货了再通知你,你再来店里拿。

同步异步的用处

听了上面一些描述,是不是觉得同步其实没什么用,总是在等待,性能方面好像不是特别好,但是实际上两种方式在实际开发中都各有用处。

异步在一些状态不那么重要的状态下有用一些,就算晚一些拿到数据也没什么。

同步更在意状态的同步,比如一个管理系统用户的登录状态,用户登录后到底有没有登录成功,这个结果不能等之后再返回给你你再处理,因为我要判断你的登录状态,才能决定我到底让不让你进入系统,总不能我让你先进入系统看看,等结果出来如果验证失败,我再让你退出登录,这是不合理的。

同步异步的原理

上面有提到,JS的本质是单线程,单线程就意味着,我同一时间只能做一件事情。

扫描二维码关注公众号,回复: 16670418 查看本文章

当我们默认是同步执行时,线程上的A、B、C任务,都将按顺序执行。

当我们采用异步执行时,A如果是一个耗时的任务,A将挂载在一个任务队列的地方,BC接着执行,如果BC也耗时,也重复进行操作。
当A的结果出来后,通知主线程,A已经可以执行了,不再耗时了,再让主线程去运行A。

代码实现

function func1(){
    
    
	console.log('fake_请求数据...');
}

function func2(){
    
    
	console.log('fake_请求请求到了...');
}
//vue 中, 方法后.then代表着,当该方法执行完了之后,执行then里的方法
func1().then(()=>{
    
    
	func2()
});

//fake_请求数据...
//fake_请求请求到了...

上面这个例子,如果func1执行完了,会执行then里的方法,then里的方法叫做回调函数,这是异步执行。
如果正常的按顺序执行,就是同步执行

func1();
func2();

async / await

async / await算是一个语法糖,他可以代替then()的作用,并且写起来很容易。
async用来修饰需要用到await的方法,一般放在方法名前面:

async fun3(){
    
    
	const a = await console.log('测试await');
}

上面请求数据的例子,我们用async / await的方法写就是:

async function func1(){
    
    
	await console.log('fake_请求数据...');
	console.log('fake_请求请求到了...');
}
func1();

为什么这样写,因为await后面跟着的方法是异步的,也就是说,await后面跟的东西都不会占用线程,但是后面的代码仍然会等待await这句话,所以请求数据这句话不会堵塞,但是请求数据之后才会打印请求到了,这就和上面的 then的用法是一个效果了

猜你喜欢

转载自blog.csdn.net/FishWooden/article/details/129022667
今日推荐