>웹 프론트엔드 >JS 튜토리얼 >jQuery 소스 코드 분석 참고 사항 (3) 지연 메커니즘_jquery

jQuery 소스 코드 분석 참고 사항 (3) 지연 메커니즘_jquery

WBOY
WBOY원래의
2016-05-16 18:05:55957검색

Deferred는 콜백 함수를 대기열에 등록하고 균일하게 관리하며 이러한 함수를 동기식 또는 비동기식으로 호출할 수 있습니다.
jQuery.Deferred()는 Deferred 객체를 생성하는 데 사용됩니다. 이 객체에는 상태 값이 있으며 거부됨, 해결됨 및 초기 상태의 세 가지 유형이 있습니다. 해결됨은 작업이 성공적으로 완료되었음을 의미하고 거부됨은 오류가 발생하여 호출이 실패했음을 의미합니다. Deferred 객체의 주요 멤버는 다음과 같습니다.
done(callback): 상태가 해결되면 호출되는 콜백 함수를 등록합니다. * 실패(콜백): 상태가 거부될 때 호출되는 콜백 함수를 등록합니다. * Always(callback): 해결 또는 거부 여부에 따라 호출되는 콜백 함수를 등록합니다. * then(successCallback, failureCallback): 성공 및 실패 콜백 함수를 동시에 전달합니다. * 파이프(successFilter, failureFilter): 성공 및 실패 콜백 함수를 호출하기 전에 파이프에서 지정한 함수를 호출합니다. 이는 함수 호출을 가로채는 파이프라인 메커니즘으로 간주됩니다. * 해결(args): 상태를 해결됨으로 설정합니다. * 거부(args): 상태를 거부됨으로 설정합니다. * promise(): 해결 및 거부 없이 불완전한 Deferred 인터페이스를 반환합니다. 즉, Deferred 개체의 상태를 수정할 수 없습니다. 읽기 전용 보기로 생각할 수 있습니다. 이는 외부 함수가 콜백 함수를 조기에 트리거하는 것을 방지하기 위한 것입니다. 예를 들어 $.ajax는 버전 1.5 이후 더 이상 XMLHttpRequest를 반환하지 않지만 대신 XMLHttpRequest 및 Deferred 개체 인터페이스를 캡슐화하는 개체를 반환합니다. Deferred 부분은 promise()에 의해 획득됩니다. 이는 외부 함수가 해결 및 거부를 호출하는 것을 방지하고 ajax가 완료되기 전에 콜백 함수가 트리거되는 것을 방지합니다. 이 두 함수의 호출 권한을 내부적으로 ajax로 예약하세요.
이 모듈의 코드는 jQuery 개체 선언 바로 다음 줄 939에서 시작됩니다. 기본적인 핵심코드라고도 볼 수 있다. 이는 버전 1.5의 가장 큰 변화 중 하나이기도 합니다.
사실 Resolve와 Reject의 코드 로직은 동일하지만 해당 상태가 다릅니다. 코드 재사용을 위해 Deferred는 먼저 내부적으로 구현된 다음 실제 Deferred 내부에 두 개의 Deferred가 새로 생성됩니다. 하나는 Resolve이고 다른 하나는 Reject입니다.
_Deferred 객체는 내부적으로 함수 배열(콜백 목록)을 유지합니다. Done(f1, f2...)의 작업은 이러한 콜백을 이 대기열에 순차적으로 푸시하고 저장하는 것입니다. 그리고 resolveWith(매개변수로 해결) 및 resolve는 이 콜백 함수를 순서대로 호출합니다.
Done에서는 이벤트가 완료되었는지 확인하는 데 필요합니다. 콜백이 체인에 추가될 때 이벤트가 완료되면 콜백을 즉시 실행해야 합니다. 이 기능은 더 이상 비동기 이벤트 트리거 선언과 함께 콜백을 작성할 필요가 없는 이유입니다. 예를 들어 $.post("...", function(data) { ... }) 를 작성해야 하는 것으로 나타났습니다. 이 성공 콜백은 여기에 작성해야 하는데 이제 작성할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

var defer = $.post("...")
// ...
defer.success(function(data) {
// ...
});
// ...
defer.fail(function(data) {
// ...
})

이러한 비동기 이벤트 선언과 콜백 함수는 별도로 관리할 수 있습니다. 이는 버전 1.5에서 재작성된 이후 가장 큰 변화입니다.
pipe(successFilter, failureFilter) 함수는 원본 개체의 콜백 목록을 수정합니다. 필터 함수는 then 함수를 사용하여 두 개의 콜백 목록 앞에 삽입됩니다. 그런 다음 돌아오세요. 이런 식으로 이 Deferred 객체의 상태가 변경되면 파이프 함수에 지정된 Filter 함수가 먼저 호출된 다음 콜백 목록이 호출됩니다.
promise()는 훨씬 간단합니다. 새 객체를 생성한 다음 필요한 멤버를 객체에 복사하기만 하면 됩니다. 필수 멤버는 promiseMethods라는 상수에 정의되어 있습니다.
코드 복사 코드는 다음과 같습니다.

var promiseMethods = "done failure isResolved isRejected promise 그런 다음 항상 파이프 ".split(" ");
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.