jQuery를 사용할 때, 나는 약속이 JS 비동기 프로그래밍 모드의 모드라는 것을 알았지 만, 그것과 jQuery의 연기 대상의 차이점을 이해하지 못했습니다. 회사의 프로젝트가 진행됨에 따라 백엔드에서 데이터를 받아야하므로이를 수행하기로 결정했습니다.
약속하다
Promise는 동기화 작업 형태로 비동기 이벤트를 작동하고 중첩 층에 의한 레이어를 피하고 체인에서 비동기 이벤트를 작동 할 수있는 모드입니다.
우리는 JavaScript 비동기 코드를 작성할 때 콜백이 가장 쉬운 메커니즘이지만,이 메커니즘을 사용하는 경우 제어 흐름, 예외 처리 및 기능 시맨틱을 희생해야하며 콜백 구덩이에 빠지게해야 하며이 문제를 해결해야합니다.
ES6에서는 angularjs 내장 Q가 약속, AngularJS 및 다음과 같이 약속/A 사양을 사용할 때 :
각 작업에는 계류, 이행 및 실패의 세 가지 상태가 있습니다.
1. 보장 상태 : 이행 또는 거부 상태로 전환 할 수 있습니다.
2. 충만한 상태 : 다른 상태로 변경할 수 없으며 상태는 변경 될 수 없으며 가치 값이 있어야합니다.
3. 반사 상태 : 다른 상태로 변경할 수 없으며 상태를 변경할 수 없으므로 이유가 있어야합니다.
상태의 이전은 일회성입니다. 국가가 이행 (완료)되거나 실패 (실패/거부)되면 더 이상 변경할 수 없습니다.
코드 사본은 다음과 같습니다.
함수 OKTOGREET (이름) {
반환 이름 === 'Robin Hood';
}
함수 asyncgreet (name) {
var deferred = $ q.defer ();
settimeout (function () {
//이 비동기 기능 FN은 미래에 비동기식으로 실행되기 때문에 모델의 변경 사항을 올바르게 관찰하면서 코드를 $ 적용 호출로 랩합니다.
$ scope. $ apply (function () {
연기.
if (oktogreet (name)) {
Deferred.resolve ( 'hello,' + name + '!');
} 또 다른 {
Deferred.reject ( 'Greeting' + Name + '는 허용되지 않습니다.');
}
});
}, 1000);
Return Deferred.Promise;
}
var promise = asyncgreet ( 'Robin Hood');
약속. 그러면 (기능 (인사) {
경고 ( '성공 :' + 인사);
}, function (이유) {
경고 ( '실패 :' + 이유);
}, 함수 (업데이트) {
ALERT ( 'GOD 알림 :' + 업데이트);
});
Q 약속의 기본 사용
위의 코드는 $ q.defer ()에 의해 구축 된 몇 가지 디퍼드 인스턴스 방법의 역할을 보여줍니다. 비동기 조작이 성공하면, 약속 객체의 상태는 "성공"(즉, 보류에서 해결에서 해결)으로 변경됩니다. 비동기 조작에 실패하면 상태는 "실패"(즉, 보류 중이기부터 거부)로 변경됩니다. 마지막으로 Return Deferred.Promise와 당시 메소드를 호출 할 수 있습니다.
JS는 기본 약속을 가질 것이며 ES6에는 이미 약속 객체가 있으며 기본 약속 API는 Firefox 및 Chrome 32 베타 버전으로 구현됩니다.
angularjs의 $ q.defferd
$ q.defferd를 호출하여 사슬로 불리는 디퍼 객체를 반환하십시오. 이 개체는 API를 통한 약속/사양에서 세 가지 작업 상태를 연관시킵니다.
Deffered API
탈출 된 물체의 방법
1. Resolve (value) : 선언 Resolve ()에서 약속 객체가 보류 상태에서 변경되어 해결을 해결합니다.
2. Reject (이유) : 선언 Resolve ()에서 약속 객체가 보류 상태에서 거부 된 상태로 변경됨을 나타냅니다.
3. Notify (value) : 선언 notify ()에서, 약속 객체의 미공개 상태는 해결되거나 거부되기 전에 여러 번 호출 될 수 있음을 나타냅니다.
객체 속성이 deffered
약속 : 마지막으로 돌아 오는 것은 원래 연기 된 대상이 아닌 새로운 지연된 대상 약속 속성입니다. 이 새로운 약속 객체는 원래 약속 객체의 상태 만 관찰 할 수 있으며, 지연된 객체의 내부 상태를 수정할 수 없으므로 작업 상태가 외부로 수정되는 것을 방지 할 수 있습니다.
약속 API
지연된 인스턴스를 만들 때 새로운 약속 객체가 생성되고 Deferred.Promise를 통해 참조를 얻을 수 있습니다.
약속 대상의 목적은 관심있는 작업이 완료 될 때 관심있는 부품이 실행 결과를 얻을 수 있도록하는 것입니다.
약속 대상의 방법
1. (ErrorHandler, fulflyedHandler, ProgressHandler) : 당시 방법은 다른 약속 상태를 듣는 데 사용됩니다. ErrorHandler는 실패한 상태를 듣고, 이행 한 핸들러는 성취 된 상태를 듣고, ProgressHandler는 충족되지 않은 상태를 듣습니다. 또한, 알림 콜백은 0 ~ 여러 번 호출 될 수 있으며, 해결 또는 거부 (해결 및 거부) 전에 진행 상황 표시를 제공합니다.
2.Catch (ErrorCallback) - 약속의 바로 가기 (NULL, ERRERCALLBACK)
3. 마지막으로 (콜백) - 약속이 실행되는지 거부되는지 여부를 관찰 할 수 있지만 마지막 값을 수정할 필요는 없습니다. 이것은 약속이 거부되었거나 해결되는지 여부에 관계없이 자원을 자유롭게하거나 쓸모없는 물건을 정리하는 데 사용될 수 있습니다. 자세한 내용은 전체 설명서 사양을 참조하십시오.
약속 체인 호출은 당시 () 메소드를 통해 구현할 수 있습니다.
코드 사본은 다음과 같습니다.
약속 b = promisea.then (function (result) {
반환 결과 + 1;
});
// Promise는 Promisea를 처리 한 직후에 처리됩니다.
// 값 가치는 Promisea가 증가한 결과입니다.
$ Q의 다른 방법
$ q.when (value) : 변수 값을 전달, promise.then () 성공적인 콜백을 실행합니다.
$ q.all (약속) : 성공적으로 실행되기 전에 여러 약속을 성공적으로 실행해야합니다. 값은 배열 또는 해시 값으로 전달됩니다. 배열의 각 값은 인덱스에 해당하는 약속 객체입니다.