jquery 지연 객체는 "Deferred"이며, 이는 jQuery.Deferred() 메서드를 호출하여 생성된 연결 가능한 유틸리티 객체입니다. 지연된 객체는 자체 메서드가 있다는 점을 제외하고 jQuery 객체와 유사하게 체인 가능합니다. 콜백 목록에 여러 콜백 함수를 등록하고 콜백 목록을 호출하고 비동기식 또는 동기식의 성공 또는 실패를 전달할 수 있습니다. 기능 상태.
이 튜토리얼의 운영 환경: windows7 시스템, jquery3.6.1 버전, Dell G3 컴퓨터.
jQuery 1.5에 도입된 지연 객체는 jQuery.Deferred() 메서드를 호출하여 생성된 링크 가능한 유틸리티 객체입니다. 콜백 목록에 여러 콜백 함수를 등록하고, 콜백 목록을 호출하고, 비동기 또는 동기 함수의 성공 또는 실패 상태를 전달할 수 있습니다.
연기된 개체는 자체 메서드가 있다는 점을 제외하면 jQuery 개체를 연결하는 방식과 유사하게 연결 가능합니다. Deferred 객체를 생성한 후 다음 메서드 중 하나를 사용하여 해당 메서드 중 하나 이상을 호출하여 생성되거나 저장된 객체에 직접 연결할 수 있습니다.
Function | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$.Deferred() | 은 연결된 유틸리티 개체 메서드를 반환하여 여러 콜백을 등록하고 콜백 대기열을 호출하여 동기화를 전달하는 데 사용됩니다. 또는 비동기 함수의 성공 또는 실패 상태입니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.always() | 는 Deferred(지연) 객체가 승인되거나 거부될 때 추가된 핸들러를 호출하는 데 사용됩니다. 수락하면 추가된 핸들러는 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.fail() | 이라고 합니다. Deferred(지연된) 객체가 거부되면 추가된 핸들러는 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.progress() | 가 사용됩니다. 지연된 개체가 진행 알림을 생성하면 추가 처리기 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.isRejected() | 1.8- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
를 호출하여 지연된 개체가 거부되었는지 확인합니다 | deferred.isResolved( )1.8 - | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Deferred 객체가 거부되었는지 확인하는 데 사용됩니다.deferred.notify() | 진행 중인 콜백에 매개변수를 전달하는 데 사용됩니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.notifyWith() | 사용된 전달 매개변수, 컨텍스트 객체 지연된 객체를 거부하기 위해 진행 중인 콜백 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.reject() | 에 매개변수를 전달하고 지연된 객체를 거부하기 위해 실패 콜백 함수 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.rejectWith() | 에 매개변수를 전달하고 매개변수를 전달합니다. 지연된 객체를 해결하기 위해 실패 콜백 함수 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.resolve() | 에 컨텍스트 객체를 전달하고 해결을 위해 doneCallbacks 콜백 함수 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.resolveWith() | 에 매개변수를 전달하고 지연 객체를 전달하고 매개변수를 전달합니다. doneCallbacks 콜백 함수에 대한 컨텍스트 객체 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.state() | 는 지연된(지연된) 객체의 현재 상태를 결정하는 데 사용됩니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.pipe() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.then() | 에서 반환된 지연된 개체의 값 지연된 개체가 해결, 거부되거나 아직 진행 중일 때 호출되는 처리기를 추가하는 데 사용됩니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.catch() | 는 Deferred 객체가 거부될 때 추가된 핸들러를 호출하는 데 사용됩니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deferred.promise() | 는 Deferred(지연된) Promise 개체를 반환하는 데 사용됩니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.promise() | 는 Promise 개체를 반환하고 바인딩된 특정 유형의 모든 작업을 관찰하는 데 사용됩니다. collection , 큐에 추가되었는지 여부. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description$.Deferred() $.Deferred()는 여러 콜백을 등록하고 콜백 대기열을 호출하기 위해 연결된 유틸리티 개체 메서드를 반환하는 생성자이며, 동기화 또는 성공 또는 실패를 전달합니다. 비동기 기능의 상태.
调用 deferred.resolve() 或 eferred.resolveWith() 转换延迟到解决状态后立即执行设置的 语法
参数说明
返回值jQuery.Deferred()工厂函数创建一个新的deferred对象。 deferred.always() 当Deferred(延迟)对象被受理或被拒绝时,调用通过deferred.always() 添加的处理程序。 提示:参数可以是一个函数或一个函数数组。由于 deferred.always() 返回的是一个 Deferred 对象,所以可以连接其他的延迟对象方法( 语法
参数说明
注意: deferred.always()方法接收了Deferred对象.resolve()或.reject()使用的参数, 这往往是非常不同的。 为此, 最好的只用它的行为,而不去检查他的参数。 在大多数情况下, 使用显式 .done() 或 .fail()处理程序,因为他们的参数都是已知的。 返回值deferred.always()返回Deferred(延迟)对象 示例&说明jQuery.get()方法返回一个来自一个Deferred(延迟)对象的jqXHR对象,我们可以附加一个成功和错误使用deferred.always()方法的回调,jQuery示例代码: $.get( "test.php" ).always(function() { alert( "带有成功和错误的回调参数的$.get方法已完成。" ); })
当Deferred(延迟)对象被受理时,调用 $.Deferred() 생성자는 새로운 Deferred(지연) 객체인 jQuery.Deferred를 생성합니다. Deferred 객체는 일시 중단된 상태에서 시작됩니다. deferred.then(), deferred.always(),
|
매개변수 | |
---|---|
beforeStart |
이는 Deferred 객체를 계속 호출할 수 있는 메서드를 나타냅니다
)에 연결할 수 있습니다. Deferred 객체가 해결되거나 거부되면 deferred.always()를 통해 추가된 콜백 함수는 추가된 순서대로 실행되고, 다음 메서드에 인수로 전달될 수 있습니다. 🎜<button>Go</button> <p>Ready...</p>
🎜deferred.done()🎜
🎜🎜🎜Deferred(지연된) 객체가 허용되면 지연 객체 함수 deferred.done()
에 의해 추가된 핸들러가 호출됩니다. 🎜🎜팁: 이 메서드는 하나 이상의 매개변수를 허용합니다. deferred.done()은 추가 .done() 메서드를 포함하여 다른 지연된 객체 메서드(Deferred 객체의 메서드를 계속 호출함)에 연결할 수 있는 Deferred 객체를 반환합니다. Deferred 객체가 해결되면 deferred.done()을 통해 추가된 콜백 함수가 추가된 순서대로 실행되며, 다음 메소드에 매개변수로 전달될 수 있습니다. 🎜🎜Syntax🎜🎜🎜deferred.done( doneCallbacks [, doneCallbacks ] )🎜🎜🎜🎜jQuery1.5에 이 기능이 추가되었습니다🎜🎜🎜매개변수 설명🎜🎜🎜🎜🎜매개변수🎜🎜 설명🎜🎜 🎜 🎜🎜🎜doneCallbacks🎜🎜 🎜 Optional/Function type🎜 Deferred 객체가 해결될 때 호출되는 함수 또는 함수 배열🎜🎜🎜🎜deferred.done() 返回的是一个 Deferred 对象
HTML示例代码:
<button>Go</button> <p>Ready...</p>
jQuery示例代码
function fn1() { $("p").append(" 1 "); } function fn2() { $("p").append(" 2 "); } function fn3(n) { $("p").append(n + " 3 " + n); } var dfd = $.Deferred();//创建一个延迟对象 //添加dfd被解决时需要的被调用的处理函数 dfd .done( [fn1, fn2], fn3, [fn2, fn1] )// 连接一个函数或者函数数组 .done(function(n) {//可以连接其他的方法 $("p").append(n + " we're done."); }); //当点击按钮时修改延迟对象的状态为已解决 //此时调用通过deferred.done()添加的延迟对象被受理后的处理函数 $("button").bind("click", function() { dfd.resolve("and");//输出:1 2 and 3 and 2 1 and we're done. });
<span style="font-size: 18px;">deferred.fail()</span>
当 Deferred (延迟)对象被拒绝时,调用通过deferred.fail()添加的处理程序。
提示:该方法接受一个或者多个参数。 deferred.fail() 返回的是一个 Deferred 对象, 可以连接其他的延迟对象方法(继续调用其他Deferred 对象的方法),包括额外的 .fail() 方法。当 Deferred 对象被拒绝时,通过deferred.fail()添加的回调函数 按它们被添加时的顺序执行,并且可以作为参数传递给如下的方法使用:deferred.resolve() 或 deferred.rejectWith()。
jQuery1.5新增该函数
参数 | 说明 |
---|---|
failCallbacks | 可选/Function类型 一个函数或者函数数组,当Deferred(延迟)对象被拒绝时被调用 |
deferred.fail() 返回的是一个 Deferred 对象
jQuery示例代码
$(function () { $.get("test.php") .done(function(){ alert("$.get 成功!"); })//解决时调用 .fail(function(){ alert("$.get 失败!"); });//被拒绝时调用 })
<span style="font-size: 18px;">deferred.progress()</span>
deferred.progress() 函数当Deferred(延迟)对象生成进度通知时,调用添加处理程序。
注意:当通过调用 notify 或 notifyWith 使延迟对象产生进度通知时,progressCallbacks 就会被调用。 由于 deferred.progress()返回的是延迟对象,所以其它延迟对象方法可以链接到该对象上(链式调用)。当延迟对象被 resolved 或 rejected 时, 进度回调函数将不再被调用,但是当Deferred (延迟)进入resolved(解决) 或 rejected(拒绝)状态后,新添加任何的progressCallbacks将立即执行,使用的参数被传递给.notify() 或 notifyWith()调用
jQuery 1.7 新增该函数
参数 | 说明 |
---|---|
progressCallbacks | 可选/Function类型 一个函数或者函数数组,当Deferred(延迟)对象生成正在执行中的进度通知时被调用。 |
deferred.progress()는 Deferred 객체
<span style="font-size: 18px;">deferred.isRejected()</span>
<span style="font-size: 18px;">deferred.isRejected()</span>
deferred.isRejected() 函数用来确定 Deferred 对象是否已被拒绝。
从jQuery1.7开始已经过时,请使用 deferred.state() 代替。
注意:
jQuery 1.5 新增该函数,1.7过时,1.8移除
deferred.isRejected() 返回的是一个 Boolean类型
<span style="font-size: 18px;">deferred.isResolved()</span>
deferred.isResolved() 函数用来确定 Deferred 对象是否已被解决。
从jQuery1.7开始已经过时,请使用 deferred.state() 代替。
注意:
jQuery 1.5 新增该函数,1.7过时,1.8移除
deferred.isResolved() 返回的是一个 Boolean类型
<span style="font-size: 18px;">deferred.notify()</span>
deferred.notify() 函数用于定一个参数,传递给正在调用的延迟对象上的回调函数 ( progressCallbacks )。
注意:
通过来自.notify()的传递参数给正在调用的延迟对象上的回调函数,当迟延对象已经被 <br> resolved 或被 rejected 之后,再调用任何 .notify() (或者添加 progressCallbacks) 都会 <br> 被忽略
를 반환합니다.
참고:Deferred 개체가 거부된 상태이면 true를 반환합니다. 이는 deferred.reject() 또는 deferred.rejectWith()가 객체에 대해 호출되었으며, 실패 콜백이 호출되었거나 호출되는 중임을 의미합니다. 지연된(지연된) 객체에는 보류, 해결 또는 거부의 세 가지 상태가 있을 수 있습니다. deferred.isResolved()를 사용하여 지연된 객체가 해결 상태인지 확인하세요.
deferred.isRejected() | |
---|---|
deferred.isRejected()는 | Boolean 유형 |
<span style="font-size: 18px;">deferred.notify()</span>
를 반환합니다. 🎜🎜🎜deferred.notify() 함수는 매개변수를 설정하고 이를 호출되는 지연 객체의 콜백 함수(progressCallbacks)에 전달하는 데 사용됩니다. 🎜🎜참고: 🎜🎜🎜일반적으로 지연된 개체(Deferred)의 작성자만 이 메서드를 호출할 수 있습니다. 🎜🎜deferred.promise()를 호출하여 제한된 Promise 객체를 반환하면 다른 코드가 지연된 객체의 상태를 변경하거나 해당 상태를 보고하는 것을 방지할 수 있습니다. 🎜🎜deferred.notify에 액세스하면 deferred.then 또는 deferred.progress에 액세스하여 진행 콜백을 추가할 수 있습니다. 콜백은 추가된 순서대로 실행됩니다. 🎜🎜🎜.notify()의 인수를 호출하는 지연된 객체의 콜백 함수에 전달하여, 지연된 객체가<br>해결되거나 거부되면 .notify()를 호출합니다(또는 ProgressCallBacks 추가). 무시됩니다 <br> 무시
🎜🎜 문법 🎜🎜🎜Deferred.notify (ARGS) 🎜🎜🎜🎜jquery 1.7 이 기능 추가 🎜🎜🎜 매개변수 🎜🎜🎜🎜🎜 매개변수 🎜🎜 설명 🎜🎜🎜🎜 🎜🎜args🎜🎜🎜옵션/객체 유형🎜 콜백을 진행하려면 선택적 매개변수 전달(progressCallbacks)🎜🎜🎜🎜deferred.notify() 返回的是一个 Deferred 对象
jQuery提供的deferred.promise()方法的作用是,在原来的Deferred 对象上返回另一个 Deferred 对象,即受限制的 Promise 对象,受限制的 Promise 对象只开放与改变执行状态无关的方法(比如done()方法和fail()方法),屏蔽与改变执行状态有关的方法(比如resolve()方法和reject()方法),从而使得执行状态不能被改变。
首先看一个 Deferred对象的执行状态被改变的例子:
var dtd = $.Deferred(); // 新建一个Deferred对象 var wait = function(dtd){ var tasks = function(){ alert("执行完毕!"); dtd.resolve(); // 改变Deferred对象的执行状态 }; setTimeout(tasks,5000); return dtd; }; $.when(wait(dtd)) .done(function(){ alert("等待执行!"); }) .fail(function(){ alert("出错啦!"); }); //代码的尾部加了一行dtd.resolve(),这就改变了dtd对象的执行状态,因此导致done()方法立刻执行 dtd.resolve();// 改变Deferred对象的执行状态
再看一个 Deferred对象返回deferred.promise()的例子:
var wait = function(){ var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象 var tasks = function(){ alert("执行完毕!"); dtd.resolve(); // 改变Deferred对象的执行状态 }; setTimeout(tasks,5000); return dtd.promise(); // 返回promise对象 }; $.when(wait()) .done(function(){ alert("哈哈,成功了!"); }) .fail(function(){ alert("出错啦!"); });
wait()函数返回的是promise对象。dtd.promise().resolve()方法不存在,因此无法改变状态
,然后,我们把回调函数绑定在这个对象上面,而不是原来的deferred对象上面。
这样的好处是,无法改变promise对象的执行状态,要想改变执行状态,只能操作原来的deferred对象。
<span style="font-size: 18px;">deferred.notifyWith()</span>
deferred.notifyWith() 函数用于给定上下文和参数,传递给正在调用的延迟对象上进行的回调函数( progressCallbacks )。
注意:
通过 .notifyWith() 传递参数给每个回调函数,当迟延对象已经被 resolved 或被 <br> rejected 之后,再调用任何 .notifyWith() (或者添加 progressCallbacks) 都会被忽略。
jQuery 1.7 新增该函数
参数 | 说明 |
---|---|
context | Object类型 作为this对象,传递给进行中的回调(progressCallbacks) |
args | Array类型 传递一个可选的参数给进行中的回调(progressCallbacks) |
deferred.notifyWith() 返回的是一个 Deferred 对象
<span style="font-size: 18px;">deferred.reject()</span>
deferred.reject() 函数用于拒绝延迟对象,并根据给定的参数调用任何 failCallbacks 回调函数。
注意:
jQuery1.5新增该函数
参数 | 说明 |
---|---|
args | Object类型 传递一个可选的参数给失败的回调(failCallbacks) |
deferred.reject()는 Deferred 객체
<span style="font-size: 18px;">deferred.rejectWith()</span>
<span style="font-size: 18px;">deferred.rejectWith()</span>
deferred.rejectWith() 函数用于拒绝延迟对象,并根据给定的 context 和 args 参数调用任何 failCallbacks 回调函数。
注意:
jQuery1.5新增该函数
参数 | 说明 |
---|---|
context | Object类型 传递一个对象给失败的回调(failCallbacks) |
args | Array类型 传递一个可选的参数给失败的回调(failCallbacks) |
deferred.rejectWith() 返回的是一个 Deferred 对象
<span style="font-size: 18px;">deferred.resolve()</span>
deferred.resolve() 函数用于解决Deferred(延迟)对象,并根据给定的args参数给完成回调函数doneCallbacks 。
注意:
jQuery1.5新增该函数
参数 | 说明 |
---|---|
args | Object类型 传递一个可选的参数给完成回调函数(doneCallbacks) |
deferred.resolve() 返回的是一个 Deferred 对象
<span style="font-size: 18px;">deferred.resolveWith()</span>
를 반환합니다.
매개변수 Description
Object type | 콜백 실패를 위한 객체 전달(failCallbacks)args |
배열 유형 | 선택적 매개변수를 전달합니다. 실패한 콜백(failCallbacks)
<span style="font-size" :>deferred.resolve()</span>
🎜🎜🎜deferred.resolve() 함수는 Deferred(지연된) 객체를 해결하고 지정된 인수 매개변수에 따라 완료하는 데 사용됩니다. 콜백 함수 doneCallbacks. 🎜🎜참고: 🎜🎜🎜일반적으로 지연된 개체의 작성자만 이 메서드를 호출할 수 있습니다. 제한된 Promise 객체를 반환하는 deferred.promise()를 호출하여 다른 코드가 지연된 객체의 상태를 변경하거나 해당 상태를 보고하는 것을 방지할 수 있습니다. 🎜🎜연기된 객체가 해결되면 deferred.then 또는 deferred.done을 통해 추가된 모든 doneCallback이 호출됩니다. 콜백 함수는 추가된 순서대로 실행됩니다. deferred.resolve()에 전달된 args 매개변수는 각 콜백 함수에 전달됩니다. 지연된 객체가 해결 상태에 들어가면 추가된 모든 doneCallback은 .resolve()에 전달된 매개변수와 함께 즉시 실행됩니다. 🎜🎜<span style="font-size: 18px;">deferred.resolveWith()</span>
🎜🎜를 반환합니다. ResolveWith() 함수는 지연된(지연) 개체를 해결하고 지정된 컨텍스트 및 args 매개 변수를 기반으로 완료 콜백 함수 doneCallbacks를 제공하는 데 사용됩니다. 🎜🎜참고: 🎜🎜🎜일반적으로 지연된 개체의 작성자만 이 메서드를 호출할 수 있습니다. 제한된 Promise 객체를 반환하는 deferred.promise()를 호출하여 다른 코드가 지연된 객체의 상태를 변경하거나 해당 상태를 보고하는 것을 방지할 수 있습니다. 🎜🎜연기된 객체가 해결되면 deferred.then 또는 deferred.done을 통해 추가된 모든 doneCallback이 호출됩니다. 콜백 함수는 추가된 순서대로 실행됩니다. deferred.resolve()에 전달된 args 매개변수는 각 콜백 함수에 전달됩니다. 지연된 객체가 해결 상태에 들어가면 추가된 모든 doneCallback은 .resolve()에 전달된 매개변수와 함께 즉시 실행됩니다. 🎜🎜🎜Syntax🎜🎜🎜deferred.resolveWith( context [, args ] )🎜🎜🎜🎜jQuery1.5에 이 기능이 추가되었습니다🎜🎜🎜매개변수 설명🎜🎜🎜🎜🎜Parameter🎜🎜Description🎜 🎜🎜 🎜🎜🎜컨텍스트🎜 🎜 🎜객체 유형🎜 완료 콜백 함수에 컨텍스트 객체 전달(doneCallbacks) 🎜🎜🎜🎜args🎜🎜🎜Array 유형🎜 완료 콜백 함수에 선택적 매개변수 전달(doneCallbacks)🎜🎜🎜🎜deferred.resolveWith()는 Deferred 객체
<span style="font-size: 18px;">deferred.state()</span>
<span style="font-size: 18px;">deferred.state()</span>
deferred.state() 函数用于确定一个Deferred(延迟)对象的当前状态。
主要是用于调试,例如,在准备拒绝(reject)一个延迟对象前,判断它是否已经处于 resolved 状态。
注意:
deferred.state() 方法返回一个字符串,代表Deferred(延迟)对象的当前状态。Deferred 对象可以在三种状态之一:
jQuery1.7 新增该函数
deferred.state() 返回的是一个 String类型
<span style="font-size: 18px;">deferred.pipe()</span>
deferred.pipe() 函数用于过滤 and/or 链式延迟对象的工具方法。
注意:从jQuery 1.8开始, deferred.pipe() 方法过时
。使用 deferred.then() 代替它。
从jQuery 1.8开始, deferred.pipe() 方法过时. 应该使用deferred.then() 代替它。
deferred.pipe()方法返回一个新的Promise对象,用于过滤状态或通过函数返回的延迟对象的值
,传递给Promise对象对应的done()、fail() 方法
doneFilter和failFilter函数过滤原先deferred(延迟)的解决/拒绝的状态和值。
从 jQuery 1.7开始,该方法还接受一个progressFilter函数,用来过滤任何访问deferred(延迟)的notify或notifyWith 方法。
这些过滤器可以随着 pipe()返回的 promise 对象的 done()或fail() 回调函数的调用,返回一个新值,或返回其它可见对象(Deferred, Promise, 等等),这些可见对象传递
了自身的解决(resolve) / 拒绝(reject)状态
和传递给 pipe promise 回调函数的返回的值
를 반환합니다.
deferred.state() 함수는 Deferred 객체의 현재 상태를 확인하는 데 사용됩니다.
참고:
pending"": 지연된 개체는 완료되지 않은 상태입니다.
rejected" : Deferred 객체가 거부된 상태에 있습니다. 이는 객체의 deferred.reject() 또는
deferred.rejectWith()가 호출되었고 실패 콜백이 호출되었음을 의미합니다(또는 호출 중).
jQuery1.7에 이 함수가 추가되었습니다 | |
---|---|
<span style="font-size: 18px;">deferred.pipe()</span> |
|
참고: jQuery 1.8부터 deferred.pipe() 메서드는 더 이상 사용되지 않습니다 . 대신 deferred.then()을 사용하세요. |
jQuery 1.8부터 deferred.pipe() 메서드는 더 이상 사용되지 않습니다. deferred.then()을 대신 사용해야 합니다. deferred.pipe() 메소드는 함수 | 에 의해 반환된 지연된 객체의 상태 또는 값을 필터링하는 데 사용되는필터 함수로 null이 사용되거나 필터 함수가 지정되지 않은 경우 파이프 약속이 해결되거나 거부될 때 동일한 값이 원래 값으로 사용됩니다. Syntax | deferred.pipe( [doneFilter ] [, failureFilter ] )
deferred.pipe() 返回的是一个 * Promise对象*
过滤解决值:
var defer = $.Deferred(), filtered = defer.pipe(function( value ) {//当延迟对象解决时被调用 // 传递给 pipe promise 回调函数的返回的值为10 return value * 2; }); defer.resolve( 5 );//延迟对象被解决 调用pipe() return 10 filtered.done(function( value ) {//filtered 传递之前返回的值 10 alert( "值是(2*5 =) 10: " + value );//弹出框输出:值是(2*5 =) 10:10 });
过滤拒绝值:
var defer = $.Deferred(), //延迟得到解决时调用回调函数为null //延迟得到拒绝的回调函数传递值value * 3 给Promise对象filtered 的fail的回调函数 filtered = defer.pipe( null, function( value ) { return value * 3; }); defer.reject( 6 );//延迟对象被拒绝 调用pipe() return 18 filtered.fail(function( value ) { alert( "值是(3*6=)18:" + value );//弹出框输出:值是(3*6 =) 18:18 });
链任务(?)
:
var request = $.ajax( url, { dataType: "json" } ), chained = request.pipe(function( data ) { //request返回值给url2 return $.ajax( url2, { data: { user: data.userId } } ); }); chained.done(function( data ) { // 通过第一个请求取回data值提供给URL2 });
<span style="font-size: 18px;">deferred.then()</span>
deferred.then() 函数当Deferred(延迟)对象被解决/拒绝或仍在进行中时,调用添加处理程序。
注意:
doneFilter 和 failFilter函数过滤原延迟对象的解决/拒绝的状态和值。
progressFilter 函数过滤任何调用原有的延迟对象的notify 和 notifyWith的方法。
这些过滤器函数可以返回一个新的值传递给的 Promise 对象的.done() 或 .fail() 回调,或他们可以返回另一个观察的对象(延迟对象,Promise 对象等)传递给它的解决/拒绝的状态和值,Promise 对象的回调。
如果过滤函数是空,或没有指定,promise(承诺)将得到与原来值相同解决(resolved)或拒绝(rejected)。
deferred.then( doneFilter [, failFilter ] [, progressFilter ] )
jQuery1.8新增该函数
deferred.then1.8-( doneCallbacks, failCallbacks)
jQuery1.5新增该函数,1.8移除
deferred.then1.8-( doneCallbacks, failCallbacks[, progressFilter ] )
jQuery1.7新增该函数,1.8移除
参数 | 说明 |
---|---|
doneFilter | Function类型 可选 当Deferred(延迟)对象得到解决时被调用的一个函数 |
failFilter | Function类型 可选 当Deferred(延迟)对象得到拒绝时被调用的一个函数 |
progressFilter | Function类型 可选 当Deferred(延迟)对象生成进度通知时被调用的一个函数调用 |
doneCallbacks | Function类型 当Deferred(延迟)对象得到解决时被调用的一个函数或函数数组 |
failCallbacks | Function类型 当Deferred(延迟)对象得到拒绝时被调用的一个函数或函数数组 |
progressCallbacks | Function类型 当Deferred(延迟)对象生成进度通知时被调用的一个函数或函数数组 |
deferred.then() 返回 Promise 对象
HTML代码:
<button>过滤解决值</button> <p></p>
过滤解决值:
var filterResolve = function() { var defer = $.Deferred(), //当延迟对象解决时被调用 //过滤解决值给then()的返回Promise对象的完成回调函数 filtered = defer.then(function( value ) { return value * 2; }); defer.resolve( 5 ); //添加Promise对象的完成回调函数 filtered.done(function( value ) { $( "p" ).html( "值是 ( 2*5 = ) 10: " + value ); }); }; $( "button" ).on( "click", filterResolve );
过滤拒绝值:
var defer = $.Deferred(), //延迟得到解决时调用回调函数为null //延迟得到拒绝的,回调函数过滤拒绝值 //传递过滤的拒绝值 value * 3 给then()的返回Promise对象的拒绝回调函数fail filtered = defer.then( null, function( value ) { return value * 3; }); defer.reject( 6 );//延迟对象被拒绝 调用then() return 18 //then()的返回Promise对象添加拒绝回调函数,并获取过滤的拒绝值 filtered.fail(function( value ) { alert( "值是(3*6=)18:" + value );//弹出框输出:值是(3*6 =) 18:18 });
链任务(?)
:
var request = $.ajax( url, { dataType: "json" } ), chained = request.then(function( data ) { //request返回值给url2 return $.ajax( url2, { data: { user: data.userId } } ); }); chained.done(function( data ) { // 通过第一个请求取回data值提供给URL2 });
<span style="font-size: 18px;">deferred.catch()</span>
当Deferred对象被拒绝(reject)时,调用通过deferred.catch()添加的处理程序。
deferred.catch( fn ) 是 deferred.then( null, fn )的一个别名
jQuery 3.0 新增该函数
参数 | 说明 |
---|---|
failCallbacks | Function类型 一个函数,当 Deferred 对象被拒绝(reject)时被调用 |
deferred.catch() 返回的是一个 Promise 对象
jQuery.get 方法返回一个jqXHR对象, 它是从Deferred对象派生的,当Deferred对象被拒绝(reject) 时,我们可以使用.catch方法来处理,jQuery示例代码:
$.get( "test.php" ) .then( function() { alert( "$.get succeeded" ); } ) .catch( function() { alert( "$.get failed!" ); } );
<span style="font-size: 18px;">deferred.promise()</span>
deferred.promise() 函数返回 Deferred(延迟)的 Promise 对象。
注意:
方法允许一个异步函数阻止那些干涉其内部请求的进度(progress)或状态(status)的其它代码。
Promise 对象只包含 deferred 对象的一组方法,包括:done(),then(),fail(),isResolved(), isRejected(), always(), 这些方法只能观察一个 deferred 的状态;不包括任何用于改变状态的延迟方法(resolve, reject, notify, resolveWith, rejectWith, 和 notifyWith),因此Promise 对象无法更改 deferred 对象的内在状态
jQuery 1.5 新增该函数
参数 | 说明 |
---|---|
target | Object类型 绑定 promise 方法的对象。 |
deferred.promise() 返回的是一个 Promise 对象
创建一个延迟对象,并设定两个延时时间是随机的定时器,分别用于受理(resolve)和拒绝(reject)延迟对象。无论哪一个先执行,都会调用其中一个回调函数。而另一个定时器则不会产生任何效果,因为在最先调用的那个定时器处理中,延迟对象已经处于完成状态(resolved 或 rejected 状态)。同时,还会设定一个定时器进度(progress)通知函数,用于进度通知处理,并在文档的 “body” 中显示 “working…”,以下为一次测试时的jQuery示例代码:
function asyncEvent(){ var dfd = new jQuery.Deferred(); var resolveValue=400+Math.random()*2000; var resolveTime=Math.floor(resolveValue) console.log("resolveTime"+resolveTime)//resolveTime:1890ms // 在一个随机的时间间隔之后 Resolve (解决状态) setTimeout(function(){ dfd.resolve("欢呼"); }, Math.floor(resolveTime)); var rejectValue=400+Math.random()*2000; var rejectTime=Math.floor(rejectValue) console.log("rejectTime"+rejectTime)//rejectTime:1364ms // 在一个随机的时间间隔之后 reject (拒绝状态) setTimeout(function(){ dfd.reject("对不起"); },rejectTime); // 每半秒显示一个"working..."消息 setTimeout(function working(){ //"pending" : Deferred 对象是尚未完成状态 //0ms 执行一次 500ms执行一次 1000ms执行一次 //1364ms 执行 dfd.reject("对不起") //传递拒绝值"对不起" 给拒绝过滤函数 alert( status+', 这次你失败了' ); if ( dfd.state() === "pending" ) { //向正在执行的Deferred 对象的回调函数列表传递参数 dfd.notify("working... "); setTimeout(working, 500); } }, 1); // 返回 Promise 对象,调用者不能改变延迟对象 return dfd.promise(); } // 为异步函数附加一个done, fail, 和 progress 处理程序 //如果向 jQuery.when 传入一个延迟对象,那么会返回它的 Promise 对象(延迟方法的一个子集) $.when( asyncEvent() ).then( function(status){ alert( status+', 事情进展顺利' ); }, function(status){ alert( status+', 这次你失败了' ); }, function(status){ $("body").append(status); } );
使用目标参数,产生现有对象的Promise对象:
// 现有对象 var obj = { hello: function( name ) { alert( "Hello " + name ); } }, // 创建一个延迟 Deferred defer = $.Deferred(); // 设置对象作为 promise defer.promise( obj ); // Resolve (解决) 该对象 defer.resolve( "John" ); // 使用该对象作为 Promise,向受理列表中添加回调函数 //延迟对象状态为解决,因此done 被调用 obj.done(function( name ) { obj.hello( name ); //将弹出 "Hello John" }).hello( "Karl" ); // 将弹出 "Hello Karl";
<span style="font-size: 18px;">.promise()</span>
.promise() 函数返回一个 Promise 对象,观察某种类型被绑定到集合的所有行动,是否已被加入到队列中。
返回的 Promise 被链接到延迟对象上,保存在元素的 .data() 中。由于 .remove() 方法会移除元素上的 data,同时也会移除元素本身。所以,使用它会防止任何元素上未被受理的(unresolved) Promise 被受理(resolving)。如果有必要在元素的 Promise 被受理(resolved)之前,从 DOM 中移除该元素的话,请使用.detach() 来代替。之后再调用 .removeData()
注意:
jQuery 1.5新增
参数 | 说明 |
---|---|
type | 可选/String类型 需要待观察队列类型。 |
target | 可选/PlainObject类型 将要绑定 promise 方法的对象。 |
默认情况下, type的值是”fx” ,这意味着返回被受理(resolve)的 Promise 对象的时机,是在所有被选中元素的动画都完成时发生的。
如果提供target参数,.promise()在该参数上添加方法,然后返回这个对象,而不是创建一个新的。它适用于在一个已经存在的对象上添加 Promise 行为的情况。
.promise()方法返回一个动态生成的 Promise对象。
1.在一个没有激活动画的集合上调用 .promise()
相关的jQuery示例代码:
//在一个没有激活动画的集合上调用 .promise(),返回一个被受理(resolved)的 Promise var div = $( "<div />" ); div.promise().done(function( arg1 ) { //弹出 "true" alert( this === div && arg1 === div ); });
2.当所有的动画结果时(包括那些在动画回调函数和之后添加的回调函数中初始化的动画),受理(Resolve)返回的 Promise,相关HTML代码
:
<style type="text/css"> //没有样式不易观察执行效果,因此添加样式设置 div{ height:100px; width:200px; border:2px solid #334455; margin-top:2px; } </style> <button>Go</button> <p>准备...</p> <div></div> <div></div> <div></div> <div></div>
当所有的动画结果时(包括那些在动画回调函数和之后添加的回调函数中初始化的动画),受理(Resolve)返回的 Promise,相关jQuery代码
:
$( "button" ).on( "click", function() { $( "p" ).append( "已开始..." ); $( "div" ).each(function( i ) { $( this ).fadeIn().fadeOut( 100 * ( i + 51 ) ); }); $( "div" ).promise().done(function() { $( "p" ).append( " 完成! " ); }); }); //效果显示好像是等动画执行完成后才执行done()方法
使用 $.when() 语句(.promise() 方法使得在 jQuery 集合中实现它变成了可能),受理(Resolve)返回的 Promise
var effect = function() { return $("div").fadeIn(800).delay(1200).append(" fadeOut! ").fadeOut(); }; $("button").bind( "click", function() { $("p").append( " 已开始... "); $.when( effect() ).done(function() { $("p").append(" 完成! "); }); //效果显示好像是等动画执行完成后才执行done()方法 });
【推荐学习:jQuery视频教程、web前端视频】
위 내용은 Jquery 지연 객체 란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!