2016-07-15 78 views
-1

我想學習jQuery推遲並在我的代碼中實現它。jQuery推遲 - 完成不工作

function function1() { 
    $deferred = $.Deferred(); 
    setTimeout(function() { 
    alert("Hello"); 
    }, 3000); 
    return $deferred.promise(); 
} 

function function2() { 
    alert('done'); 
} 
$("button").click(function() { 
    function1().done(function2()); 
}); 

我有一個簡單的功能function1function2,我想function2function1執行後調用,但我不能夠得到的結果。 任何人都可以指出我究竟做錯了什麼。

我使用jQuery的1.10.js作爲我的版本

謝謝。

+1

爲什麼你使用這樣一箇舊版本的jQuery?即使你想保留很老的瀏覽器兼容性,你至少可以使用最新的1.x版本。 – jfriend00

回答

3

你非常接近。

您需要resolve自己的諾言,並使用.then: -

function function1() { 
 
    $deferred = $.Deferred(); 
 
    setTimeout(function() { 
 
    alert("Hello"); 
 
    $deferred.resolve(); 
 
    }, 3000); 
 
    return $deferred.promise(); 
 
} 
 

 
function function2() { 
 
    alert('done'); 
 
} 
 
$("button").click(function() { 
 
    function1().then(function2); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<button>call</button>

+1

呃,沒有理由在這裏使用'$ .when()',實際上這是浪費和錯誤的推薦它。你可以直接執行'function1()。then(...)'。另外,我強烈建議使用ES6標準'.then()'而不是jQuery專有'.done()'。在jQuery 3.x中,兩者之間的行爲存在着重要的區別,因爲jQuery使'.then()'更符合ES6承諾標準。 – jfriend00

+0

@ jfriend00謝謝。我已經更新了答案。 – BenG

2

你有幾個問題:

  1. 你從來沒有解決您的推遲。您必須致電def.resolve(),以通知承諾監聽者現在已解決該承諾。
  2. function1().done(function2());需要爲function1().done(function2);。當你在function2()之後有一個parens時,告訴JS解釋器立即調用該函數並通過undefined的返回值。如果沒有這些參數,那麼將該函數的引用作爲.done()處理函數傳遞,以便承諾基礎結構可以在稍後調用它(這就是您想要的)。

我建議以下代碼:

function function1() { 
    return $.Deferred(function(def) { 
     console.log("start of function1"); 
     setTimeout(function() { 
      console.log("timer fired"); 
      def.resolve(); 
     }, 3000); 
    }).promise(); 
} 

function function2() { 
    console.log('done'); 
} 
$("button").click(function() { 
    function1().then(function2); 
}); 

除了固定上述問題,這也改變了:

  1. 它採用遞延構造。這節省了一些代碼(使用更少的中介),並且與ES6承諾規範更兼容,並且由jQuery支持。
  2. 它使用.then()而不是jQuery專有的.done(),它更符合ES6承諾規範並且受jQuery支持。

我還建議你升級到jQuery的更新版本,因爲1.10已經有3年多了。如果你必須保持與舊版IE的兼容性,至少可以使用1.12.4。