2013-07-19 4 views
0

움직이는지도를 만들려고합니다.jQuery의 중첩 콜백

내지도에 드롭 지점을 가질 수 있도록 콜백의 모든 실행 ...

// Animate the drops 
$marker.animate({ 
    top : '100px' 
}, 500, 'easeOutBounce', function(){ 
    $america.animate({ 
     top : '150px' 
    }, 500, 'easeOutBounce', function(){ 
     $england.animate({ 
      top : '80px' 
     }, 500, 'easeOutBounce', function(){ 
      $australia.animate({ 
       top : '300px' 
      }, 500, 'easeOutBounce'); 
     }); 
    }); 
}); 

http://jsfiddle.net/Liamatvenn/T3CTH/1/

이 이것에 대해 갈 나쁜 방법이다

? 이것은 방문자의 컴퓨터에서 더 많은 리소스를 차지합니까?

+0

"이것에 대해 나쁜 방법입니까?" - 그게 주관적인거야 – Quentin

+3

"또는 내 방문자 컴퓨터에서 더 많은 리소스를 차지할 것인가?" - 뭐라구? – Quentin

+2

@PatsyIssa 귀하의 명료화는 실제로 아무 것도 명확히하지 못합니다. "running all 4"는 현재 코드에서 일어나는 일입니다. 나는 네가 "네 명 모두 동시에 뛰는"것을 의미한다고 생각한다. 그리고 사람들을 모욕 할 필요가 없습니다. "그가 [...]을 의미한다는 것이 나에게 명백하다"라고 말하는 것으로 충분했을 것입니다. –

답변

12

그것은 나쁜 방법은 아니지만 추악한 (주관적인) 것이며 유지하기가 어려워 질 수 있습니다.

jsFiddle

: 당신이 queue를 사용할 수

jsFiddle

$marker.animate({ 
    top : '100px' 
}, 500, 'easeOutBounce').promise() 
.then(function(){ 
    return $america.animate({ 
     top : '150px' 
    }, 500, 'easeOutBounce').promise(); 
}) 
.then(function(){ 
    return $england.animate({ 
     top : '80px' 
    }, 500, 'easeOutBounce').promise(); 
}) 
.then(function(){ 
    return $australia.animate({ 
     top : '300px' 
    }, 500, 'easeOutBounce').promise(); 
}); 

을 또는 : 나는 중첩 된 콜백을 방지하기 위해, .promise().then()과 조작, 약속 개체를 정리 것

var $queue = $("<div>"); 
$queue.queue(function(next){ 
    $marker.animate({ 
     top : '100px' 
    }, 500, 'easeOutBounce',next); 
}).queue(function(next){ 
    $america.animate({ 
     top : '150px' 
    }, 500, 'easeOutBounce',next); 
}).queue(function(next){ 
    $england.animate({ 
     top : '80px' 
    }, 500, 'easeOutBounce',next); 
}).queue(function(next){ 
    $australia.animate({ 
     top : '300px' 
    }, 500, 'easeOutBounce',next); 
}).dequeue(); 
6

@KevinB는 이미 콜백 피라미드를 작성하는 방법을보다 편리하게 보여주었습니다. 엠. 그러나 스크립트는 여전히 반복적입니다. 더 나은 결과 :

var p = new $.Deferred().resolve(); 
$.each([ 
    [$marker, 100], 
    [$america, 150], 
    [$england, 80], 
    [$australia, 300] 
], function(_, x) { 
    p = p.then(function() { 
     return x[0].animate({ 
      top : x[1]+'px' 
     }, 500, 'easeOutBounce').promise(); 
    }); 
}); 
+0

나는 비슷한 해결책을 연구 중이다. 유지 보수하는 데 훨씬 좋은 코드입니다. 잘 했어! –

+0

[Array :: reduce'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)를 사용하면 더 우아하게 작성할 수 있지만, 불행히도 이것은 [tag : jQuery] 질문입니다 :-) – Bergi

+0

다른 사람들이이 솔루션의 우아함을 볼 수 있도록하기 위해 [jsfiddled it] (http://jsfiddle.net/T3CTH/7). 필자는 클래스 선택자를 인라인으로 인라인하여 $ 마커는 $ (마커), $ america는 $ ('아메리카') '등이 될 것입니다. 똑같다. –