2012-06-28 1 views
0
$.Deferred(function(dfr) { 
    $("#container > div").each(function() { 
     var $div = $(this); 
     dfr = dfr.pipe(function() { 
      return $div.fadeIn(); 
     }); 
    }); 
}).resolve(); 

위의 코드에서 개별적 DFR을로드하고 $ .Deferred()과 같은에 전달할 수있는 방법이 있는가 ....

$("#container > div").each(function() { 
      var $div = $(this); 
      dfr = dfr.pipe(function() { 
       return $div.fadeIn(); 
      }); 
     }); 

$.Deferred(function(dfr) { }).resolve(); 

http://jsfiddle.net/realwork007/KgY33/25/이 예제와 비슷하지만, 나는 단지 dfr을 별도로 채울 것입니다.

편집 : 나는 선택 정렬 알고리즘을 시각화 쓰고 있어요 내가 변경 backgroundOfBlock(), 깜박임 (인덱스) 및 스왑 등의 3 ~ 4 도우미 함수 (에서까지)가

그래서 내 선택 정렬 시각화 될 것이다 같은 :

function selectionSort(items){ 

    var len = items.length, min; 

    for (i=0; i < len; i++){ 

    blink(blocks[i]);// to show It is selected 

     //set minimum to this position 
     min = i; 
     changebackground(blocks[i]);//show it is min 
     //check the rest of the array to see if anything is smaller 
     for (j=i+1; j < len; j++){ 
      if (items[j] < items[min]){ 
       min = j; 
       swap(blocks[min], blocks[j]);//swap animation function 
      } 
     } 

     . 
     . 
     . 
     . 

나는 한 번 함께이 ​​방법을 모든 애니메이션 실행을 실행하지만 ... 그들이 어떤 기술을 사용하여

... sequencially 실행해야하는 경우

+1

정확히 접근하려고합니까? – Bergi

답변

0

그냥 추측 :

var dfr; 
$("#container > div").each(function() { 
    var $div = $(this); 
    dfr = dfr 
     ? dfr.pipe(function() { 
      return $div.fadeIn().promise(); 
     }) 
     : $div.fadeIn().promise(); 
}); 

dfr.done(alert.bind(window, "All divs faded In")); 

당신은 당신이 단지 바로 해결하려는 경우, 새로 Deferred 구축을 필요로하지 않는 것. 처음으로 promise을 사용하십시오. 당신이 원하지 않는 경우, 당신은이 작업을 수행 할 수 있습니다

var first = new $.Deferred, 
    curDfr = first; 
function blink($el) { 
    curDfr = curDfr.pipe(function() { 
     return $el.animate("background-color", "red").animate("background-color", "transparent").promise(); 
    }); 
} 

// now you can use blink() in your algorithm 
// and the animation will be executed when all piped deferreds before 
// have been resolved 

first.resolve(); // you can move this where you want 
curDfr.done(/* when everything happened */); 

그래서, 당신은 하나 개의 글로벌 변수가 지연된 채 내려 올 것이다, 언제든지 당신은 애니메이션을 추가 할 새로 교체 배관 약속. 이는 우리가 시연 한대로 fadeIn뿐 아니라 changeBackground, blink 또는 swap도 사용할 수 있습니다.

have a look.queue() 일 수도 있습니다. 이는 지연된 것보다 애니메이션에 더 적합 할 수 있습니다.

+0

편집을 보시고 내가 정확히 맞은 곳의 예를 추가했습니다. 감사합니다. –

+0

좋습니다. 그리고 이미 가지고있는 작업 코드를 사용하는 것이 어떻습니까? 또는 동기 루프 등을 포팅하는 것입니까? – Bergi

+0

현재 코드의 문제점은 모든 애니메이션이 한 번에 발생한다는 것입니다. 스레드가 blink()를 호출한다고 가정 해보십시오. blink()가 애니메이션을 완성 할 때까지 기다리지 않고 다음 문장을 실행합니다. 결국 내가 본 것은 모든 블록이 색이 바뀌고 한번 깜박입니다. 하나씩 차례로 시도해야하므로 연기를 시도하고 해결합니다. –