호출 항목 체인 호출에는 Async.go 메서드와 Async.chain 메서드라는 두 가지 항목이 있습니다. 이 두 항목은 Async.chain 메서드가 호출 시 초기화를 제공하지 않는다는 점을 제외하면 본질적으로 동일합니다. , Async.go 메서드는 호출 시 초기 매개변수를 제공하고 비동기 호출 체인을 시작합니다.
Async.chain = function() {
var chain = new Async.Operation({ chain: true });
return chain;
}
Async.go = function(initialArgument) {
return Async.chain(). go(initialArgument );
}
여기서 체인 호출 자체도 Async.Operation임을 알 수 있습니다. 체인 호출에 필요한 go 메서드와 next 메서드는 모두 Async입니다. 확장을 수행하며 이 확장은 다음 섹션에서 설명하는 것처럼 어렵지 않습니다.
확장 메서드
addCallback 메서드를 통해 추가된 콜백 함수는 적어도 동기 함수의 경우 하나씩 실행된다는 것을 모두 알고 있으므로 Async.Operation의 이 기능을 사용하여 비동기 호출 대기열을 유지할 수 있습니다. 단, 비동기 호출 대기열에 대한 지원을 추가했습니다.
비동기 호출 대기열 지원에 대해서는 먼저 미리 만들어진 addCallback 메서드와 Yield 메서드를 사용하여 go 메서드와 next 메서드를 확장합니다.
this.go = function(initialArgument) {
return this.yield(initialArgument);
}
this.next = function(nextFunction) {
return this.addCallback(nextFunction)
실제 위의 go 메소드와 next 메소드는 Yield 메소드와 addCallback 메소드를 직접 호출합니다. go 메서드의 의미 체계는 Async.Operation 인스턴스에 매개 변수를 전달하고 호출 대기열을 시작한다는 점에서 항복 메서드와 동일합니다. 동시에 next 메소드와 addCallback 메소드의 의미는 대기열 끝에 호출을 추가합니다.
비동기 대기열
원래 동기화만 지원하는 대기열이 어떻게 비동기 대기열도 지원할 수 있나요? 이를 위해서는 대기열에 있는 각 호출의 반환을 감지해야 합니다. 반환 유형이 Async.Operation인 경우 비동기 호출임을 알 수 있으므로 특수 메서드를 사용하여 실행 전에 완료될 때까지 기다릴 수 있습니다.
callbackResult = callback(self.result);
self.result = callbackResult;
if (callbackResult && callbackResult instanceof Async.Operation) {
innerChain = Async.chain()
while (callbackQueue.length > 0) {
innerChain.next (callbackQueue.shift());
}
innerChain.next(function(result) {
self.result = 결과;
self.state = "완료";
self.completed = true;
return result;
});
callbackResult.addCallback(function(result) {
self.result = result;
innerChain.go(result); 🎜>} );
}
호출이 Async.Operation 인스턴스를 반환하는 경우 자체 addCallback 메서드를 사용하여 대기열에 있는 나머지 호출을 실행합니다. 정확하게 말하면 새 호출 체인을 구성하고 대기열에 있는 나머지 호출을 새 호출 체인으로 전송한 다음 현재 비동기 호출이 콜백에서 이 새 호출 체인을 시작하도록 합니다.
또한 새로운 비동기 호출 대기열과 호환되도록 약간의 수정이 필요한 부분이 있습니다. 예를 들어 체인 호출에서는 결과, 상태, 완료의 상태 변경이 다릅니다.
요약
비동기 호출 대기열을 지원하도록 원본 Async.Operation을 약간 수정했습니다. 여기에서 전체 코드를 확인하세요. 체인 호출을 지원하는 비동기 호출 프레임워크인 Async.Operation. 이제 강력한 Async.Operation이 있으므로 이를 보다 일반적인 사용 패턴에 적용하는 방법을 살펴보겠습니다.