0

jQuery의 .one()을 사용하는 것과 유사한 방식으로 .done() 콜백이 한 번 실행 된 후에 jQuery의 $.when()을 바인딩 해제 할 방법을 찾고 있습니다. 단일 이벤트의 경우 .on() 대신 이 상황에서 이벤트 대신 지연된 객체를 사용하는 이유는 콜백을 실행하기 전에 여러 비동기 프로세스가 완료 될 때까지 기다려야하기 때문입니다.

자세한 내용을 보려면 각 페이지에 대한 모델과 뷰가있는 백본 응용 프로그램에서 작업하고 있습니다. ,

  • $.when() 비동기 프로세스 (3 기다려야 페이지 (A)에 의해 사용되는 렌더링하라고 들어오는 페이지

    1. 보기 (페이지 A를 호출) : 새 페이지를 표시하는 순서는 다음과 같이 보입니다 페이지 A가 서버로부터로드 4 & 5)
    2. 이전 페이지를 사전로드 된 페이지 B되는 모델에게 페이지 A의 모델
    3. 화상 채우는
    4. 데이터를 해결하기 위해, 개폐 완료 (애니메이션)
    5. 완료
    6. 페이지 A가 렌더링됩니다.

    각 페이지는 사용자가 한 번만 방문하는 가상 시나리오에서 잘 작동합니다. 그러나 페이지는 분명히 반복적으로 방문 할 수 있습니다. 즉, 페이지 B가 열리고 사용자가 웹 사이트의 다른 곳을 탐색 한 후 다시 닫히면 코드 블록을 실행하여 .close() 메소드 완료와 관련된 지연 객체가 다시 한 번 해결됩니다. .done() 콜백 페이지 A의 .render() 메서드가 잘못되었습니다.

    $.when().done() 코드 블록은 한 번 실행되는 즉시 "언 바운드"되거나 다른 많은 이벤트 수신기가 언 바운드되는 것과 마찬가지로 각 페이지의 .close() 메서드에서 이상적입니다.

    나는 이것이 가능할지 모르겠다. 어쩌면 여기서 내가하려고하는 것을 달성하기위한 대체 방법이 있을지 모르겠다. 어쩌면 그들의 연기가 지연되어 여러 가지 사건을 듣는 경로 일 수 있습니까?

    감사합니다.

  • +0

    100 % 분명한 것 : 난 당신이 뭔가를해야한다고 생각? – charlietfl

    +0

    여기에 대한 이야기는 http://jsfiddle.net/charlietfl/qR4yH/ 일련의 AJAX 호출입니다. 알 수없는 번호이지만 최종 내용은 완료된 모든 호출에 종속됩니다. – charlietfl

    +0

    구현할 수 있음을 이해합니다. '$. 언제.apply ($, arrayOfDeferreds)'를 사용하여 약속 목록을 기다려야한다.하지만 일단 완료된'$ .when '을 언 바인드하거나 다음 번에 arrayOfDeferreds 인수의 내용을 변경하고 싶다. 페이지가 방문되어 새로운 지연 목록이 해결 될 때까지 기다리고 (더 이상 이전 목록과 관련이 없음) 기다립니다. 이것은'$ .when.apply'가 배열을 참조로 유지하지 않고 단순히 그 내용을 개별 인수로 적용하기 때문에 작동하지 않습니다. – adekom

    답변

    0

    내부적으로 jQuery는 여러 함수 (예 : 이벤트 핸들러)의 추가/삭제/실행을 관리하기 위해 여러 메소드에서 "콜백"대기열을 사용합니다.

    이러한 대기열의 생성자는 $.Callbacks(flags)으로 표시됩니다. 'once', 'memory', 'unique'및 'stopOnFalse'플래그를 사용하면 실행시 대기열의 자세한 동작을 제어 할 수 있습니다. 더 읽기 here.

    '방문'및 '반복 방문'의 성격이 무엇인지 확실하지 않지만 자바 스크립트 상태가 지속된다고 가정하십시오. 그렇지 않으면 문제가 발생하지 않습니다. defffereds의 배열을 만들 수있는 그것이 길이 도움이있는 경우 배열에`$ .when`를 사용하여 ... 어떤 문제

    //First let's assume you have three promises, corresponding to your steps 3,4,5 
    var promiseA = .....; 
    var promiseB = .....; 
    var promiseC = .....; 
    
    //Then you need one or more worker functions 
    function myFunction() { 
        //do whatever is necessary when promises A,B,C are all resolved. 
    } 
    
    //Create a Callbacks queue with the 'once' flag 
    var callbacks = $.Callbacks('once');//'once' ensures the callback list can only be fired once. 
    callbacks.add(myFunction); 
    //add further callback functions here if necessary. 
    
    //Now the glue that puts it all together. 
    $.when(promiseA, promiseB, promiseC).done(callbacks.fire); 
    
    //Or, if you need to pass any paramters to the callback function: 
    $.when(promiseA, promiseB, promiseC).done(function() { 
        callbacks.fire(...); 
    });