Deferred是jQuery中用于处理异步操作的对象,类似于ES6的Promise。它通过$.Deferred()构造函数创建,并提供了一系列方法如.then()、.always()等来注册回调函数。在解决(resolve)或拒绝(reject)状态改变时,对应的回调队列会被执行。常用于解决回调地狱问题,例如在等待异步图片加载完成后再执行后续操作。
摘要由CSDN通过智能技术生成
Deferred跟ES6中的Promise的套路是差不多的,不过Deferred是JQuery中的函数,我们先来看一下Deferred的一些介绍吧。
$.Deferred() 是一个构造函数,用来返回一个链式实用对象方法来注册多个回调,并且调用回调队列,传递任何同步或异步功能成功或失败的状态。
$.Deferred() 构造函数创建一个新的 Deferred(延迟)对象, jQuery.Deferred 可传递一个可选的函数,该函数在构造方法返回之前被调用并传递一个新的 Deferred 对象作为函数的第一个参数。例如被调用的函数可以使用 deferred.then()来附加回调函数。
一个 Deferred 对象开始于挂起状态。任何使用 deferred.then(), deferred.always(), deferred.done(), 或者 deferred.fail() 添加到这个对象的回调函数都是排队等待执行的。调用 deferred.resolve() 或 deferred.resolveWith() 转换延迟到解决状态后立即执行设置的 doneCallbacks 。调用 deferred.reject() 或 deferred.rejectWith() 转换延迟到拒绝状态后立即执行设置的 failCallbacks 。一旦对象已经进入了解决或拒绝状态,它保持该状态。回调仍然可以添加到已解决或已拒绝的 Deferred 对象——它们会立即执行。
1、处理异步请求后再执行业务代码;
2、解决回调地狱;
今天遇到这样一个功能,就是上传图片时,要保存图片的高和宽,但是获取图片的高宽,创建一个Image对象,要等Image对象load完成后才会返回图片的信息,因此这是个异步操作。上传一张图片是好办的,但是如果有多张图片呢?所以我就想到了Deferred
举个栗子:
uploadImgs: function(){
var deferred = $.Deferred();
var _URL = window.URL || window
首先,
Deferred
是Promise的一种实现,并且,
Deferred
对象
可以通过Callbacks实现,两者的使用方式也很像。
由于Promise有两种完成状态,一种resolve,一种reject,所以,对应的Callbacks就有两个,还有一个notify,似乎不是标准的Promise状态?
Deferred
用到了Callbacks里面的memory参数,是因为Promise达到完成...
deferred
对象
是一个
延迟
对象
,意思是函数
延迟
到某个点才开始执行,改变执行状态的方法有两个(成功:resolve和失败:reject),分别对应两种执行回调(成功回调函数:done和失败回调函数fail)
2.$.when()
【文字转载于菜鸟教程】
deferred
1.html
在多个
延迟
对象
传递给
jQuery
.when() 的情况下,该方法返回一个新的"宿主"
延迟
对象
,当所有的...
在JQ的
延迟
对象
中,$.
deferred
()有比较多的下辖
对象
,下面将解析有那些
对象
,先把
deferred
封装起来:
var def = $.
deferred
();
$.
deferred
(fn) // 代表
延迟
执行开始前执行的
对象
fn()
def.done(fn)
1.只需要在调用普通函数或方法前加上关键字defer,就完成了defer所需要的语法。当defer语句被执行时,跟在defer后面的函数会被
延迟
执行。直到包含该defer语句的函数执行完毕时,defer后的函数才会被执行,不论包含defer语句的函数是通过return正常结束,还是由于panic导致的异常结束
2.defer语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加...
什么是defrred
对象
开发网站过程中,我们经常遇到某些耗时长的JS操作,其中,既有异步操作(如Ajax读取服务器数据),也有同步的操作(如遍历一个大型数组),它们都不能立即得到结果。通常的做法是,为它们制定回
调函数(callback)。即事先规定。一旦它们运行结束,应该调用哪些函数。
1.什么是
deferred
对象
deferred
对象
是一个
延迟
对象
,意思是函数
延迟
到某个点才开始执行,改变执行状态的方法有两个(成功:resolve和失败:reject),分别对应两种执行回调(成功回调函数:done和失败回调函数fail)
2.
deferred
对象
使用示例ajax方式其实是
deferred
对象
1)普通的ajax操作
$.ajax({
url: "index.html",
...
想象这样一种场景:通常我们在编程的时候,经常会遇到资源申请完成后,再手工释放。比如打开一个文件后,再执行 close 操作关闭文件描述符,如果你不关闭,则会产生描述符泄露。如果程序逻辑复杂,这非常容易出错。因为你的函数可能随时遇到错误而 return 出去,此时你极易忘记 close 掉申请过的资源。
Go 提供了关键字 defer 帮忙我们解决这个问题。它有点像 C++ 里的 RAII 机制,...