同步与异步的理解 异步编程 回调函数

一、同步和异步

同步与异步是指访问数据的机制,同步一般指主动请求并等待IO操作完成的方式。

异步则指主动请求数据后便可以继续处理其它任务,随后等待IO操作完毕的通知。

同步和异步最大的区别就在于:同步需要等待,异步不需要等待。

浏览器发送请求给服务器,其有同步请求和异步请求两种方式,接下来我们以浏览器发送请求为例进一步对同步与异步的理解进行说明。

同步的概念

对于同步请求而言,浏览器在发送一个请求之后,需要等待服务器响应返回,才能够发送下一个请求,这一过程的示意图如下所示:

同步请求存在着两个明显的缺陷:

① 请求发出后必须要等待响应

比如当遇到请求阻塞,网络延迟等情况时,用户需要进行等待,这样会导致用户体验效果差。

② 每次请求都需要重新加载整个页面

比如在访问某个页面时,有的时候用户可能只需要请求获取页面某一部分内容的响应,但是当用户发送请求后,整个页面的所有内容都需要重新加载后再响应给用户,这样同样会导致用户的体验较差。

异步的概念

异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。

在我们学习的传统单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。而异步的概念则是不保证同步的概念,也就是说,一个异步过程的执行将不再与原有的序列有顺序关系。

简单来理解就是:同步按你的代码顺序执行,异步不按照代码顺序执行,异步的执行效率更高。

以上是关于异步的概念的解释,接下来我们通俗地解释一下异步:异步就是从主线程发射一个子线程来完成任务。

与同步请求相对,发送异步请求不需要等待服务器响应,随时可以发送下一次的请求,减少了用户遇到请求阻塞、网络延迟时需要等待的时间。

同样以用户访问某个页面为例,用户需要请求获取页面某一部分内容的响应,如果用户发送的是异步请求,那么服务器会根据请求对页面进行局部的刷新,而不用每次请求都刷新整个页面,异步请求可以提升用户的体验。

二、什么时候用异步编程

在前端编程中(甚至后端有时也是这样),我们在处理一些简短、快速的操作时,例如计算 1 + 1 的结果,往往在主线程中就可以完成。主线程作为一个线程,不能够同时接受多方面的请求。所以,当一个事件没有结束时,界面将无法处理其他请求。

现在有一个按钮,如果我们设置它的 onclick 事件为一个死循环,那么当这个按钮按下,整个网页将失去响应。

为了避免这种情况的发生,我们常常用子线程来完成一些可能消耗时间足够长以至于被用户察觉的事情,比如读取一个大文件或者发出一个网络请求。因为子线程独立于主线程,所以即使出现阻塞也不会影响主线程的运行。但是子线程有一个局限:一旦发射了以后就会与主线程失去同步,我们无法确定它的结束,如果结束之后需要处理一些事情,比如处理来自服务器的信息,我们是无法将它合并到主线程中去的。

为了解决这个问题,JavaScript 中的异步操作函数往往通过回调函数来实现异步任务的结果处理。

三、回调函数

回调函数就是一个函数,它是在我们启动一个异步任务的时候就告诉它:等你完成了这个任务之后要干什么。这样一来主线程几乎不用关心异步任务的状态了,他自己会善始善终。

个人理解 :

js是一条流水线工作,也就是单线程。同步既是在主线程上排队 按照代码顺序 依次执行

异步则是将任务从主线程发射到一个“子线程”,在主线程任务执行完毕后再执行“子线程”。既不会按照原有的代码顺序执行。但是子线程有一个局限:一旦发射了以后就会与主线程失去同步,我们无法确定它的结束,如果结束之后需要处理一些事情,比如处理来自服务器的信息,我们是无法将它合并到主线程中去的。

为了解决这个问题,JavaScript 中的异步操作函数往往通过回调函数来实现异步任务的结果处理。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
异步编程中,回调函数是一种常见的处理方式。当一个异步操作完成时,系统会调用预先定义好的回调函数来处理结果。回调函数通常作为参数传递给异步操作的函数,以便在操作完成后进行调用。 举个例子,假设我们有一个异步读取文件的操作。在传统的同步编程中,我们会使用阻塞方式等待文件读取完成后再进行下一步操作。但在异步编程中,我们可以使用回调函数来处理文件读取完成后的结果。 下面是一个简单的示例代码,展示了如何使用回调函数处理异步文件读取: ```python import asyncio async def read_file(file_path, callback): # 模拟异步读取文件的操作 await asyncio.sleep(1) # 假设文件读取完成后返回内容 content = "File content" # 调用回调函数处理结果 callback(content) def handle_result(content): print("File content:", content) # 异步读取文件,并指定回调函数 asyncio.run(read_file("file.txt", handle_result)) ``` 在上述代码中,`read_file` 函数是一个异步函数,它模拟了文件的异步读取操作。在操作完成后,会调用传入的回调函数 `callback` 来处理结果。 `handle_result` 函数是我们定义的回调函数,它接收文件读取完成后的内容,并进行处理。在这个例子中,我们简单地打印了文件的内容。 通过使用回调函数,我们可以在异步操作完成后执行特定的逻辑,而不需要等待操作完成。这种方式可以提高程序的并发性和响应性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值