어리석은 질문 인 경우 용서해주세요. 나는 몇 시간 동안 노력해 왔고 두뇌는 이제 막 작동을 멈췄다.
저는 세 가지 AJAX 호출로 구성된 시스템을 가지고 있습니다. 첫 번째 호출의 서버 응답은 일반적으로 입니다. 성공; 그러나 두 번째와 세 번째 쿼리는 이미지 업로드이기 때문에 깨지기 쉽고 서버 측에서는 클라이언트의 이미지가 대부분 실패하는 유효성 검사 규칙이 너무 많습니다. 위의 규정
window.AjaxCall = function() {
// to pass to $.ajax call later
this.args = arguments;
// xhr status
this.status = null;
// xhr results (jqXHR object and response)
this.xhrResponse = {};
this.dfr = new $.Deferred();
// to provide an easier interface
this.done = this.dfr.done;
this.fail = this.dfr.fail;
this.then = this.dfr.then;
};
AjaxCall.prototype.resetDfr = function() {
this.dfr = new $.Deferred();
};
AjaxCall.prototype.resolve = function() {
this.dfr.resolve(
this.xhrResponse.result,
this.xhrResponse.jqXHR
);
this.resetDfr();
};
AjaxCall.prototype.reject = function() {
this.dfr.reject(
this.xhrResponse.jqXHR
);
this.resetDfr();
};
AjaxCall.prototype.query = function() {
var _this = this;
// if query hasn't run yet, or didn't return success, run it again
if (_this.status != 'OK') {
$.ajax.apply(_this, _this.args)
.done(function (result, textStatus, jqXHR) {
_this.xhrResponse.result = result;
_this.xhrResponse.jqXHR = jqXHR;
_this.resolve();
})
.fail(function (jqXHR) {
_this.xhrResponse.jqXHR = jqXHR;
_this.reject();
})
.always(function (a, b, c) {
var statusCode = (typeof c !== 'string'
? c
: a).status;
if (statusCode == 200) {
_this.status = 'OK';
}
});
}
// if query has been run successfully before, just skip to next
else {
_this.resolve();
}
return _this.dfr.promise();
};
AjaxCall
클래스이며,이 같은 세 개의 연속 호출합니다
var First = new AjaxCall('/'),
Second = new AjaxCall('/asd'),
Third = new AjaxCall('/qqq');
First.then(function() {
console.log('#1 done');
}, function() {
console.error('#1 fail');
});
Second.then(function() {
console.log('#2 done');
}, function() {
console.error('#2 fail');
});
Third.then(function() {
console.log('#3 done');
}, function() {
console.error('#3 fail');
});
var toRun = function() {
First.query()
.then(function() {
return Second.query();
})
.then(function() {
return Third.query()
});
};
$('button').click(function() {
toRun();
});
그 코드는 테스트 환경에 있습니다. 그리고 테스트 환경에서는 간단한 HTML 페이지와 디버깅을위한 기본적인 서버 지원을 의미합니다.
- 홈 페이지 (/)는 항상 200 성공를 반환합니다.
- /ASD 반환 (404)는 처음 3 번 및 200 성공번 패턴으로 (즉 세 404을를 찾을 수 없음 -> 하나 (200) -> 세 404 -> 하나 (200) -> 세 404s -> ...).
- /qqq은 404를 찾을 수 없습니다. 항상입니다.
페이지의 유일한 단추를 누르면 첫 번째 쿼리는 성공을 반환하고 두 번째는 예상대로 실패합니다. 버튼을 두 번째로 클릭하면 첫 번째 쿼리는 지난 번 성공했기 때문에 건너 뛰었고 두 번째 쿼리는 예상대로 실패했습니다.
문제는 여기에 있습니다 :
- 나는
dfr
이 alreay 해결 또는 거부하기 때문에, 그것은 더 이상resolve
및reject
방법에 반응하지 않는resetDfr
방법을 사용하기 전에. 내가 예에 표시하는 방식으로resetDfr
메서드를 호출 할 때 - ,
dfr
해결하거나 다시을 거부 할 수 있지만 이전dfr
의 콜백은 새로운dfr
개체와 바인더 제본되지 않고 내가 할 수 없었다 이전의 콜백을 새로운dfr
으로 복제하는 방법을 찾으십시오.
내가 여기서하려는 일을 수행하기위한 귀하의 제안은 무엇입니까?
그것은 당신이 실현하려 시도하고있는 무슨 질문에서 실제로 분명하지 않다. 지연된 콜백을 복제하고 싶습니다. 그러나 무엇을 위해? 클릭 할 때마다 모든 요청을 다시 실행 하시겠습니까? 왜 이러한 요청은 병렬로 실행되지 않고 연속적으로 실행되어야합니까? –
@ YuryTarabanko 요청은 실제 제품에서 첫 번째 쿼리가 양식 필드를 데이터베이스 테이블에 저장하고 ID가있는 응답을 저장하기 때문에 연속적이어야합니다. 다른 검색어는 해당 ID와 함께 전송됩니다. ** 전에 실패한 경우 ** 요청을 다시 실행하고 싶습니다. 사용자가 요청을 보내면 서버에 오류가 있음을 알리는 메시지가 표시되면 사용자에게 오류에 대해 경고하여 입력 (이미지)을 적절하게 변경하고 다시 시도 할 수 있습니다. – Hkan