jQuery源码解析-----Deferred是什么?

本文介绍了jQuery中的Deferred机制,探讨了其如何简化异步处理,并通过实例展示了如何使用$.Deferred和$.when来协调多个异步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Deferred是什么?

前端项目的开发,不仅仅涉及到同步的概念,而且还会经常穿插各种异步的处理。一些大的操作,比如远程获取数据,操作一个大数据处理,这时候是不能马上获取到数据的。假设我们发送一个AJAX请求到接受到数据需要10秒钟,那么从发送到接受数据这个时间段中,前端的处理时间其实是空闲,但是对于开发者来说这种时间是不能浪费了,所以我们可以在10秒钟做很多同步的处理,同时等待异步的数据返回。所以我们需要监听这个回调的数据在成功的时候能够获取到,或者设计一个返回后触发处理的机制,当然原生的JavaScript对这个机制几乎是没有的。为了优化这个形成统一的异步处理方案,jQuery就开始设计了一个Deferred异步模型。

    Deferred 提供了一个抽象的非阻塞的解决方案(如异步请求的响应),它创建一个promise对象,其目的是在未来某个时间点返回一个响应。简单来说就是一个异步/同步回调函数的处理方案。

$.Deferred在jQuery代码内部有四个模块被使用,分别是“promise方法”、“DOM ready”、“Ajax模块”及“动画模块”。

看看jQuery中的最常用的AJAX处理:

一:Ajax的改造

传统的jQuery的AJAX操作的传统写法(1.5版之前):

$.ajax({
  url: "aaron.html",
  success: function(){
     alert("成功!");
  },
  error:function(){
    alert("失败!");
  }
})

$.ajax()接受一个对象参数,这个对象包含两个方法:success方法指定操作成功后的回调函数,error方法指定操作失败后的回调函数。

在1.5版本后通过新的Deferred引入就改成了:

$.ajax("aaron.html")
.done(function(){ alert("成功"); })
.fail(function(){ alert("出错"); });

把传参的回调,换成了链式的写法,这样可读性更高了。在jquery 1.5版后,通过$.ajax返回的不是XHR对象了,而是经过包装的Deferred对象,所以就具有promise的一些规范。当然这种写法到底是怎么做的,我们在后续的教程中会详细的讲解到。

二:提供一种方法来执行一个或多个对象的回调函数

在实际开发中,我们可能要发送多个异步的请求操作,我们需要等所有的异步都处理完毕后,才能继续下一个动作。如右边代码所示。

所以我们这里要涉及一个等待的处理。我们自己要做一个计时器,每一个任务执行完毕后,都要触发一次任务的检测。当最后一个调用完毕了,我们就可以执行后面的动作,当前这里的写法也会有些问题,比如错误的时候没有处理。同样的功能,我们换成Deferred就会很简单了。

$.when($.ajax("a1.html"), $.ajax("a2.html"))
  .done(function(){ alert('2次回调都正确返回了') })
  .fail(function(){ alert('出错了'); });

这段代码的意思是:先执行两个操作$.ajax("a1.html")和$.ajax("a2.html"),如果都成功了,就运行done()指定的回调函数;如果有一个失败或都失败了,就执行fail()指定的回调函数。

三:可以混入任意的对象接口中

jQuery的Deferred最好用的地方,就是模块化程度非常高,可以任意配合使用。

function task(name) {
  var dtd = $.Deferred();
  setTimeout(function() {
    dtd.resolve(name)
  }, 1000)
  return dtd;
}
$.when(task('任务一'), task('任务二')).done(function() {
  alert('成功')
})

把需要处理的异步操作,用Deferred对象给包装一下,然后通过when方法收集异步的操作,最后再返回出done的成功,这样的处理太赞了!

所以说,Deferred的引入,为处理事件回调提供了更加强大并且更灵活的编程模型。

资源下载链接为: https://pan.quark.cn/s/d37d4dbee12c A:计算机视觉,作为人工智能领域的关键分支,致力于赋予计算机系统 “看懂” 世界的能力,从图像、视频等视觉数据中提取有用信息并据此决策。 其发展历程颇为漫长。早期图像处理技术为其奠基,后续逐步探索三维信息提取,与人工智能结合,又经历数学理论深化、机器学习兴起,直至当下深度学习引领浪潮。如今,图像生成和合成技术不断发展,让计算机视觉更深入人们的日常生活。 计算机视觉综合了图像处理、机器学习、模式识别和深度学习等技术。深度学习兴起后,卷积神经网络成为核心工具,能自动提炼复杂图像特征。它的工作流程,首先是图像获取,用相机等设备捕获视觉信息并数字化;接着进行预处理,通过滤波、去噪等操作提升图像质量;然后进入关键的特征提取和描述环节,提炼图像关键信息;之后利用这些信息训练模型,学习视觉模式和规律;最终用于模式识别、分类、对象检测等实际应用。 在实际应用中,计算机视觉用途极为广泛。在安防领域,能进行人脸识别、目标跟踪,保障公共安全;在自动驾驶领域,帮助车辆识别道路、行人、交通标志,实现安全行驶;在医疗领域,辅助医生分析医学影像,进行疾病诊断;在工业领域,用于产品质量检测、机器人操作引导等。 不过,计算机视觉发展也面临挑战。比如图像生成技术带来深度伪造风险,虚假图像和视频可能误导大众、扰乱秩序。为此,各界积极研究检测技术,以应对这一问题。随着技术持续进步,计算机视觉有望在更多领域发挥更大作用,进一步改变人们的生活和工作方式 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值