Async.Operation을 설계하는 원래 목적은 Ajax 호출이 콜백 매개변수를 전달해야 하는 문제를 해결하는 것입니다. 이러한 이유로 먼저 Ajax 요청을 Async.Operation에 캡슐화합니다. 물론 여기서는 jQuery를 사용하고 있습니다. 어떤 기본 라이브러리를 사용하든 Async.Operation을 사용할 때 이 간단한 캡슐화를 수행할 수 있습니다.
Ajax를 캡슐화한 후에는 비즈니스 로직 작성에 집중할 수 있습니다.
Friend 개체가 있고 해당 개체의 get 메서드는 단일 친구 개체를 반환하는 데 사용되고 getAll 메서드는 모든 친구 개체를 반환하는 데 사용된다고 가정합니다. 이에 대응하는 두 개의 서버측 API는 친구 인터페이스가 단일 친구 JSON을 반환하고, 친구 목록 인터페이스는 모든 친구 이름으로 구성된 JSON을 반환합니다.
.addCallback (function( json) {
for (var i = 0; i < json.length; i ) {
chain.next(function() {
return get(json.shift())
.addCallback(function(friend); });
})
}
chain
.next(function() { Operation.yield(friends) ; })
.go();
})
반환 작업
}
여기서는 friendlist 인터페이스에서 반환된 JSON이 배열이라고 가정합니다. 이 배열을 얻은 후 각 호출의 논리는 동일합니다. 즉, 첫 번째 친구를 제거합니다. Array.name인 경우 get 메소드를 사용하여 해당 친구 개체를 얻은 다음 친구 개체를 다른 배열에 넣습니다. 호출 대기열이 끝나면 친구 객체를 보유하는 배열을 반환하기 위해 또 다른 호출을 추가합니다.
이 예에서는 이전 함수의 결과를 다음 함수에 전달하기 위해 호출 대기열 기능을 사용하지 않았지만 호출 대기열의 사용을 보여주기에는 충분합니다. - 여러 하위 레이어 허용 Ajax 요청을 수행하기 위해 비동기 작업은 고정된 순서로 차단 방식으로 실행됩니다.
기본 비동기 함수가 Async.Operation을 반환하므로 바로 다음 메서드에 전달할 수도 있고, 익명 함수로 래핑하여 다음 메서드에 전달할 수도 있으며, 내부에는 반환이 하나만 필요합니다. 익명 함수.
지연 기능
위의 예에서는 서버의 공격 방지 전략이 실행되는 것을 방지하기 위해 대기열을 사용하지만 때로는 이것만으로는 충분하지 않습니다. 예를 들어 서버는 두 요청 사이에 최소 500밀리초가 필요합니다. 그렇지 않으면 공격으로 간주되며 이 간격을 대기열에 삽입합니다.
원래 next 메소드에서 호출한 익명 함수에 setTimeout을 수동으로 추가하는 것도 하나의 방법인데, 이런 문제를 해결하기 위해 보조 함수를 작성해 보는 것은 어떨까요? 도우미 메서드를 작성하고 이를 Async.Operation과 원활하게 통합해 보겠습니다.
Async.wait = function(delay, context ) {
var 연산 = new Async.Operation();
setTimeout(function() { Operation.yield(context); }, 지연)
반환 연산;
Async.Operation.prototype.wait = function(delay, context) {
this.next(function(context) { return Async.wait(delay, context); });
이 도우미 메서드를 사용하면 위의 getAll 메서드에서 각 Ajax 요청 사이에 500밀리초 간격을 쉽게 구현할 수 있습니다. for 루프 내에서 대기하도록 호출을 추가하기만 하면 됩니다.
코드 복사
.wait(500)
.next(function() {
return get(json.shift())
.addCallback( friend) { friends.push(friend); });
});
}
요약
Async. Operation을 사용하는 일반적인 방법과 필요한 경우 해당 기능을 확장하는 방법입니다. Async.Operation이 모든 사람이 Ajax 애플리케이션의 코드 가독성을 향상시키는 데 효과적으로 도움이 되기를 바랍니다.