2013-03-15 2 views
3

JQuery Deferreds를 하나씩 콜백 피라미드없이 차례대로 실행하는 방법이 있습니까?콜백 피라미드가없는 JQuery 체인 지연

는 지금은 이런 일을 할 필요가 :

$.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Foo'); 
     dfd.resolve(); 
    }, 1000); 
}) 
.done(function() { 
    $.Deferred(function(dfd) { 
     console.log('Bar'); 
     dfd.resolve(); 
    }).done(function() { 
     console.log('done'); 
    }); 
}); 

출력 :

$.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Foo'); 
     dfd.resolve(); 
    }, 1000); 
}) 
.then($.Deferred(function(dfd) { 
    console.log('Bar'); 
    dfd.resolve(); 
})) 
.done(function() { console.log('done') }); 

: 나는 이런 식으로 뭔가를 할 수 있기를 원하는

을 수행 푸, 바, 원하지 않는 결과물 : Bar, Foo, done

감사합니다.

답변

1

코드의 문제는 을 예상하는 반면 .then()은 jQuery 객체를 전달한다는 것입니다. 이 코드는 필요에 따라 foo-bar-done을 실행합니다.

$.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Foo'); 
     dfd.resolve(); 
    }, 1000); 
}).then(function(){ 
    return $.Deferred(function(dfd) { 
     console.log('Bar'); 
     dfd.resolve(); 
    }); 
}).done(function() { console.log('done') }); 
+0

참고 : JQuery와 1.8 이상에서이 유일한 작품. 그 전에, 당신은'.pipe()'를 사용할 필요가 있습니다. – MgSam

+0

그리고 1.6/1.7 이전에는'.pipe()'가 작동하지 않았습니다. 명시되지 않은 한 jQuery 질문은 최신 버전을 참조한다고 가정합니다.이 경우이 답변은 정확하며 그로 표시되어야합니다. –

+0

죄송합니다. 추가 테스트를 통해 작동하지 않는다고 판단 했으므로 표시를 취소했습니다. 첫 번째 이유는 JQuery 버전 이었지만 두 번째 이유는 누락 된'return' 키워드 때문이었습니다. – MgSam

0

$.when()을 사용하고 싶습니다. 이 같은

뭔가 작업을해야합니다 :

var d1 = $.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Foo'); 
     dfd.resolve(); 
    }, 1000); 
}); 

var d2 = $.Deferred(function(dfd) { 
    setTimeout(function() { 
     console.log('Bar'); 
     dfd.resolve(); 
    }, 2000); 
}); 

$.when(d1, d2).then(function() {console.log('done')});