2017-02-17 1 views
1

jQuery에서 모든 .done 또는 .fail 핸들러 이후에 .always 핸들러를 어떻게 실행할 수 있습니까? 예를 들어jQuery 모든 첨부 된 .done/.fail 핸들러 이후의 .always 핸들러

, 내가 이렇게 연기 반환하는 함수가있는 경우 :

function getDeferred() { 
    return $.ajax({ 
      url: '/test.json', 
      type: 'GET', 
      dataType: 'json', 
      cache: false 
      }).fail(function (jqXHR, textStatus, errorThrown) { 
      alert('fail !'); 
      }).always(function (jqXHR, textStatus, errorThrown) { 
      alert('always !'); 
      }); 
} 

내가 글로벌 .always 핸들러가이 같은 특정되는 .done 핸들러를 첨부 할 수 있습니다

getDeferred().done(function (data, textStatus, jqXHR) { 
    alert('done !'); 
}); 

jQuery에서 핸들러는 우리가 첨부 한 순서대로 호출되는 것처럼 보입니다. 내 경우에는. 항상 전에.

+0

[jQuery .always] (https://api.jquery.com/deferred.always/) 문서 ▶' Deferred가 해결되거나 거절되면 콜백은 제공된 인수를 사용하여 추가 된 순서대로 실행됩니다''.Done' 전에'geDeferred()'가 해결할 때' getDeferred()'를 먼저 호출해야합니다. – Nope

+0

그것은 합법적 인 것처럼 보인다! 그러나 내가하고 싶은 일을하는 어떤 트릭이 있습니까? –

답변

1

jQuery에서 핸들러는 우리가 을 첨부하는 동일한 순서로 호출되는 것처럼 보입니다. 필자의 경우 항상 .done 앞에

지연이 해결되거나 거부되면 콜백은 추가 된 순서대로 실행됩니다.
jQuery eferred.always Documentation

따라서는 추가 .done

내가하고 싶은 일을하기 위해 어떤 트릭이되기 전에 getDeferred 내에서 핸들러가 실행된다는 의미가?

특정 지연 객체 방식이 있는지는 잘 모르겠지만 매개 변수로 추가 처리기를 전달하고 필요에 따라 실행할 수 있습니다.

다음은 복잡하게 보일 수 있으며 더 좋은 방법 일 가능성이 있지만 작동해야합니다.

function getDeferred(handlers) { 
    var defaultHandlers = { 
     done: {}, 
     fail: {}, 
     always:{}, 
    } 

    var _handlers = $.extend({}, defaultHandlers, handlers); 

    return $.ajax({ 
     url: '/test.json', 
     type: 'GET', 
     dataType: 'json', 
     cache: false 
    }).done(function(jqXHR, textStatus, errorThrown) { 
     if ($.isFunction(_handlers.done)) { 
      _handlers.done(); 
     } 
    }).fail(function(jqXHR, textStatus, errorThrown) { 
     alert('fail !'); 
     if ($.isFunction(_handlers.fail)) { 
      _handlers.fail(); 
     } 
    }).always(function(jqXHR, textStatus, errorThrown) { 
     alert('always !'); 
     if ($.isFunction(_handlers.always)) { 
      _handlers.always(); 
     } 
    }); 
} 

다음과 같이 호출 :

var handlers = { 
    done: function(data, textStatus, jqXHR) { 
     alert('done !'); 
    } 
} 

getDeferred(handlers); 

이 실행됩니다 .always하기 전에 당신이 원하는 .done 당신으로. 여전히 getDeferred()이 완료된 후에도 무언가를 실행하고 싶다면 여전히 수행 할 수 있습니다. getDeferred(handlers).done(...)

+0

매개 변수로 전달하면 내가 생각했던 것입니다. +1. $ 끝내기 :) –