요약 : 비동기 코드와 콜백을 사용하더라도 코드를 읽을 수 있도록하기 위해 잘 확립 된 모범 사례 패턴이 있습니까?
비동기 적으로 많은 작업을 수행하고 콜백에 크게 의존하는 JavaScript 라이브러리를 사용하고 있습니다. 간단한 "load A, load B, ..."메소드를 작성하는 것은이 패턴을 사용하는 것이 매우 복잡하고 따르기가 어려워 보입니다.
(구상 된) 예를 들어 보도록하겠습니다. 원격 웹 서버에서 (비동기 적으로) 많은 이미지를로드하려고한다고 가정 해 봅시다. C # / 비동기에서는 다음과 같이 작성합니다.
disableStartButton();
foreach (myData in myRepository) {
var result = await LoadImageAsync("http://my/server/GetImage?" + myData.Id);
if (result.Success) {
myData.Image = result.Data;
} else {
write("error loading Image " + myData.Id);
return;
}
}
write("success");
enableStartButton();
코드 레이아웃은 "이벤트 흐름"을 따릅니다. 먼저 시작 버튼이 비활성화 된 다음 이미지가로드되고 ( await
UI가 응답 상태를 유지함) 시작 버튼이 다시 활성화됩니다.
JavaScript에서는 콜백을 사용하여 다음을 수행했습니다.
disableStartButton();
var count = myRepository.length;
function loadImage(i) {
if (i >= count) {
write("success");
enableStartButton();
return;
}
myData = myRepository[i];
LoadImageAsync("http://my/server/GetImage?" + myData.Id,
function(success, data) {
if (success) {
myData.Image = data;
} else {
write("error loading image " + myData.Id);
return;
}
loadImage(i+1);
}
);
}
loadImage(0);
단점은 분명하다고 생각합니다. 루프를 재귀 호출로 재 작업해야했고, 마지막에 실행되어야하는 코드는 함수의 중간 어딘가에 있으며 다운로드를 시작하는 코드 loadImage(0)
는 맨 아래에 있습니다. 일반적으로 읽고 따르는 것이 훨씬 어렵습니다. 못 생겼어요.
나는이 문제에 처한 첫 번째 사람이 아니라고 확신하므로 내 질문은 : 비동기 코드와 콜백을 사용하더라도 코드를 읽을 수 있도록 유지할 수있는 잘 확립 된 모범 사례 패턴이 있습니까?
LoadImageAsync
실제로 Ext.Ajax.request
Sencha Touch를 호출합니다 .
async.waterfall
당신의 대답이다.