2013-06-05 104 views
0

我從來沒有使用過jQuery $ .Deferred,到目前爲止我還沒有找到一個可以讓我頭腦清晰的例子。jQuery的示例按順序執行代碼的延遲方法

我需要的是能夠按順序執行3個獨立的任務,步驟1,步驟2和步驟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(); 

有沒有人有一些簡單的工作在一個小提琴?

+0

我不認爲你可以使用setTimeout的那樣。它期望一個函數或代碼,其中你的5000毫秒是https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout – Ronnie

回答

2

爲了連鎖Deferred就像是,你必須使用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來模擬長時間運行的操作。

這背後的想法是返回名爲然後將指示爲donefail定義(如果有的話如此)回調基礎上返回的結果採取行動的每個功能Deferred對象。

JS Fiddle

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);