2012-02-09 111 views
0

我有一個函數。該函數的內部看起來像:jQuery推遲:

if (isNewCustomer) { 
    doSomething(); 
    cleanup(); 
} 
else { 
    $.getJSON(..., function(result) { 
     doSomethingElse(); 
     cleanup(); 
    }); 
} 

我希望我可以簡單地這樣通過推遲。我的嘗試看起來像:

var do_it = doSomething; 

if (!isNewCustomer) { 
    do_it = $.getJSON(..., function(result) { 
     doSomethingElse(); 
    }); 
} 

$.when(do_it).done(function() { 
    cleanup(); 
}); 

但是,這是行不通的。我究竟做錯了什麼?

編輯:重命名變量dodo_it。這不是代碼的問題。問題是,do_itdoSomething時,doSomething未得到執行。

+2

*做*是在JavaScript – Gigi 2012-02-09 22:44:22

回答

3

do是javascript中的關鍵字,所以更好地重命名該變量。

var do_it = doSomething; 

if (!isNewCustomer) { 
    do_it = $.getJSON(..., function(result) { 
     doSomethingElse(); 
    }); 
} 
//   || << note me 
$.when(do_it()).done(function() { 
    cleanup(); 
}); 
+0

謝謝你的關鍵詞,但是當'do_it'是'doSomething','永遠不會調用doSomething'。 – barfoo 2012-02-09 23:11:55

+0

我根本不知道jQuery的延遲,但似乎必須在*調用時實際調用*內部的條件函數。 我編輯了我的答案。 – Gigi 2012-02-09 23:16:54

+0

1.在原始q中,您不執行該功能。你只是傳遞函數作爲參數(沒有括號)。 2)考慮到這是一個很容易發現的問題,如果你的doSomething返回一個新的Deferred,那麼這將不起作用,或者只有在返回的deferred被解析後纔會調用cleanUp。 – sbr 2012-06-22 22:16:36

1
var result; 

if (isNewCustomer) { 
    result = doSomething(); 
} else { 
    result = $.getJSON(..., function(data) { 
     doSomethingElse(data); 
    }); 
} 

$.when(result).done(function() { 
    cleanup(); 
}); 

見上面的代碼:你從來沒有所謂就像梁詠琪指出的功能。

+2

你知道你低估自己嗎? – Jason 2012-02-13 21:50:56

-1

您需要一個明確的延遲。如果你傳遞了一個不是Deferred的參數,那麼這個函數會立即被調用,並且可能是你得到意想不到的結果的原因。

var deferred = $.Deferred(); 

if (isNewCustomer) { 
    deferred.resolveWith(doSomething()); 
} 
else { 
    $.getJSON(...). 
     done(function(result) { 
      deferred.resolveWith(doSomethingElse(result)); 
     }). 
     fail(function(...) { 
      deferred.rejectWith(...); 
     }); 
} 

deferred.promise().always(function() { cleanup(); }); 
+0

使用延遲不會改變一個事物... $。當這個內部已經...我知道它,因爲我實際上編碼它。 – 2012-02-11 14:26:20

+0

那麼,你的解決方案是什麼? – Jason 2012-02-13 21:47:11

+0

您是否意識到您在此處添加了一個令人滿意的答覆,包括您自己的答案?你是否也知道你在這裏沒有爲jQuery團隊贏得積分? – Jason 2012-02-14 17:38:30

0

看看這個的jsfiddle https://jsfiddle.net/timlint/tg7xqtha/

使用延遲是要走的路。有時難以掌握流程以及如何傳遞數據,但這個例子可能會給你一些見解。

你幾乎可以想到延期爲旗幟。在一個函數中你創建一個延遲對象。

該函數返回該延遲的.promise()。這允許你調用函數doSomething(bool).done(),並在它完成後做些事情。當您知道任務已完成並且在此之前不會被調用時,您可以解決延遲問題。

function doSomething(isNewCustomer) 
{ 

// think of a deferred as a flag object in a way 
var d = $.Deferred(); 


if(!isNewCustomer) 
{ 
    $.getJSON(..., function(result) { 
     // work with data 
    }).done(function() { 
     // finisn up data 

     // set deferred to resolved 
     d.resolve(); 
    }); 
} 
else 
{ 
    // some business logic 

    // set deferred to resolved 
    d.resolve(); 
} 
// returning the promise lets you call .done() 
// on this function call in the main call 
return d.promise(); 
}