2013-06-05 69 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);