2013-06-05 2 views
0

jQuery $ .Deferred를 사용한 적이 없으며 지금까지 머리를 쓸 수없는 예를 발견하지 못했습니다.jQuery 예제 코드를 순서대로 실행하기위한 지연된 메소드

내가 필요한 것은 1 단계, 2 단계 및 3 단계의 순서로 3 개의 개별 작업을 수행 할 수 있어야합니다. 2 단계는 1 단계가 완료 될 때까지 대기해야하며 3 단계는 실행하기 전에 2 단계가 완료 될 때까지 대기해야합니다. .

 var construct = new $.Deferred(); 

     construct.done(function() { 
      console.log('Step 1'); 
     }); 

     construct.done(function() { 
      setTimeout(5000); 
      console.log('Step 2'); 
     }); 

     construct.done(function() { 
      console.log('Step 3'); 
     }); 

     construct.resolve(); 

이 사람이 바이올린 뭔가 간단한 작업이 있습니까 :

나는 다음과 같은 있지만, 어디서든 받고있는 것으로 보인다 노력하고있어? Deferred의 같은 체인 위해

+0

JS Fiddle

난 당신이 그런에서는 setTimeout 사용할 수있는 것 같아요. 5000 밀리 초가있는 곳의 함수 또는 코드가 https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout 일 것으로 기대합니다. – Ronnie

답변

2

, 당신은 then을 사용하고 반환 가지고 Deferred 새로운 : 여기

var construct = $.Deferred(); 

construct.then(function() { 
    console.log('Step 1'); 
}) 
.then(function() { 
    return $.Deferred(function (dfd) { 
     setTimeout(function() { 
      console.log('Step 2'); 
      dfd.resolve(); 
     }, 5000); 
    }); 
}) 
.then(function() { 
    console.log('Step 3'); 
}); 

construct.resolve(); 

는 바이올린의 : http://jsfiddle.net/fMMsz/

0

내가 라인을 따라 뭔가를 작성했습니다 반면에 비동기식 작업을 원하지만 순서대로 원한다면 이와 같은 것을 시도 할 수 있습니다. 장기 실행 작업을 시뮬레이트하려면 setInterval이 있습니다.

이 뒤에 아이디어는 (어느 경우 경우) done 또는 fail에 대해 정의 된 콜백 반환 된 결과에 따라 행동을 지시 할 것이다라는 각 기능에 대한 Deferred 개체를 반환하는 것입니다.

var loadQueue = function() { 
    var dfrQueue1 = new $.Deferred(); 
    var i = 0; 
    var loop = window.setInterval(function() { 
     ++i; 
     console.log('queue 1 - running: '+i); 
     if (i >= 10) { 
     // pass optional param to success callback 
     dfrQueue1.resolve('queue 1'); 
     clearInterval(loop); 
     } 
    }, 1000); 

    console.log('initiating queue 1'); 
    return dfrQueue1.promise(); 
}; 

var loadQueue2 = function() { 
    var dfrQueue2 = new $.Deferred(); 
    var i = 0; 
    var loop = window.setInterval(function() { 
     ++i; 
     console.log('queue 2 - running: '+i); 
     if (i >= 5) { 
      // pass optional param to success callback 
      dfrQueue2.resolve('queue 2'); 
      clearInterval(loop); 
     } 
    }, 1000); 

    console.log('initiating queue 2'); 
    return dfrQueue2.promise(); 
}; 

var t = loadQueue().done(loadQueue2); 
관련 문제