2011-03-02 5 views
2

는 그래서이를 생각하고이jquery 1.5에서 지연된 콜백을 중지 할 수 있습니까? 내가 궁금

// Assign handlers immediately after making the request, 
// and remember the jqxhr object for this request 
var jqxhr = $.ajax({ url: "example.php" }) 
    .success(function(response) { alert("success"); }) 


// perform other work here ... 

// Set another success function for the request above 
jqxhr.success(function(response){ alert("second success"); }); 

같은 뭔가를 말한다. 내 성공으로 넘어갈 모든 응답에 사용하려는 일반적인 기능이 있습니다.

이 기능은 기본적으로 서버 유효성 검사에서 오류가 있는지 확인하는 검사를 수행합니다. 그랬다면 그것을 포맷하고 메시지를 표시합니다.

이제 몇 가지 방법으로 두 번째 성공 함수가 특정 작업을 수행 할 수 있는지 궁금합니다. Like ajax 요청은 테이블에 행을 추가해야합니다. 그래서 이것은 가능해야합니다. 나는 위의 것을 수행하고 두 번째 성공에서 나는 단지 행을 추가합니다.

첫 번째 성공이 끝나고 서버에서 유효성 오류가 발생하여 두 번째 성공을 막을 수 있다고 생각할 수도 있습니까?

If(first success finds errors) 
{ 
    // print out errors 
    // don't continue onto next success 
} 
else 
{ 
    // go to next success 
} 

편집

정렬 나는 뭔가 호출 deferred.reject이며이 중지하지 않습니다하지만 난 단지 성공을 중지하도록 지정할 수 있는지 궁금 것을 발견했다. 완성 된 것 같은 다른 기성의 것들이 있다면 제 생각에는 거부 될 것입니까?

$.post('example.php', {name_1: value_1, name_2: value_2}, function(response){ 
    //this code gets executed when the AJAX request was successful 

    //do some more stuff 

    //check the response 
    if(response == 'success'){ 
    second_success_function(response); 
    } 
}); 

이 예는 '당신이 문자열을 얻을 가정 : 첫 번째 성공 기능은 AJAX 호출의 응답을 평가하고 요구 사항

예를 충족 결정할 때

답변

0

유효성 검사 기능이 하나만있는 경우 ajax 요청에 직접 전달하지 않고 지연된 자체 처리 기능을 만들고 처리기를 연결할 수 있습니다.

이 예제는 단일 레벨의 유효성 검사를 제공합니다.이 패턴을 함께 연결하려면 다른 패턴이 필요할 수 있습니다.

var validated = function(jqxhr, validationFunction){ 
    var myDeferred = new $.Deferred(); 
    var doValidation = function(){ 
     var result = validationFunction.apply(this, arguments); 
     if (result){ 
      myDeferred.resolve(arguments); 
     } 
     else 
     { 
      myDeferred.reject(arguments); 
     } 
    }; 

    jqxhr.success(doValidation); 
    return myDeferred; 
}; 

var jqxhr = $.ajax({ url: "/echo/json/"}); 
var vtest = validated(jqxhr, function(response){ 
    //Do your validation check here, 
    //return true if it passed, false if it failed. 
    return false; 
}); 

//attach your handlers to vtest 
vtest.done(function(response){alert("yay");}); 
vtest.fail(function(response){alert("drats");}); 
0

는 두 번째 성공 함수를 호출 모든 것이 계획대로 진행될 때 성공했습니다.

$ .post 호출의 두 번째 인수는 스크립트에 전달한 값의 맵입니다. 이것은 선택 사항입니다.

모든 AJAX 요청이 완료되면 실행될 처리기를 지정할 수도 있습니다.

http://api.jquery.com/ajaxStop/

+0

예를 들려 줄 수 있습니까? – chobo2

0

AFAIK 아니, 당신은 그런 (.ajax() 객체가 연기 객체을 확장의 jQuery 1.5 버전의로 )를 deferred object를 사용할 수 없습니다.

deferred object에 콜백을 추가하면 .success(.....이 누적됩니다. 지연된 객체 resolves (, ajax가 성공적으로 완료되면) 스택 된 모든 콜백이 실행됩니다. 너무 늦게 시도하고 reject 예를 들어, 더 이상 성공 콜백을 실행 중지하는 개체. here

그것은 아마도 더 나은 당신이 당신의 성공 기능에 필요한 로직을 수행하고 반복적 인 작업을 돌봐 및 로직 테스트를 통과하면 성공에서 호출하는 래퍼 함수를 ​​호출을 살펴보십시오.의견에 따라


업데이트 : 콜백을 죽이고 논리를 사용

var cs = true; 
var jqxhr = $.ajax({ 
    beforeSend: function(){ 
     cs=true; 
    }, 
    url: "/echo/json/" 
}) 

.success(function(response) { 
    if(cs) 
    alert("success"); 
}) 

.success(function(response) { 
    if(cs) 
     cs = false; 
     alert("success 2"); 
}) 

.success(function(response) { 
    if(cs) 
     alert("success 3"); 
}); 

.

+0

거절을 시도했을 때 두 번째 성공이 멈추지 않았습니다. 내가 제대로 이해 한 이유가 아마도 효과가 있었던 이유는 첫 번째 성공에서 거부가 완료되어 기술적으로 완료되지 않은 이유입니다. – chobo2

+0

@ Scoobler- 나는 멀티 포인트 성공 콜백이 필요한 시점을 얻지 못했습니다. 나는 내가하려고하는 것처럼 당신이 할 수있는 것이 어쩌면 그렇게 생각할 것입니다. – chobo2

+0

아니, 내 이해는, 당신이 개체를 만들 때 그것은 모든 콜백 _ (성공) _ 다음 개체가 완료되면 _ (거부 또는 해결 호출되었습니다) _ 그것을 처리합니다. 스택. 결국 콜백 (callback)이 수행되고 객체가 일을 마친 후에 수행해야 할 작업이 있습니다. 즉, 줄마다 이동하지 않습니다. _ [__update__] (http://jsfiddle.net/Scoobler/fmCax/1/) _을 다시 살펴보십시오. 다른 하나는 개체가 해결 호출을 받으면 변경되거나 거부 될 수 없다는 것입니다. 생각하지 않습니다. – Scoobler

관련 문제