2012-09-19 44 views
4

我希望能夠理解爲什麼我在試圖鏈接延遲對象時得到不同的行爲,而不是嘗試通過將對象保存在變量中並調用一個或多個延遲方法那個變量。

將對象保存在變量中時,發送到每個函數的值是相同的(在下面的代碼片段中,5) - 即在這種情況下值不會過濾。當直接鏈接時,值過濾器...所以我不清楚如何在幾個不同的語句中設置Deferred.pipe()時發生過濾。和我的jquery docs的閱讀,它應該是可能的:

遞延對象是可鏈接的,類似於一個jQuery對象是可鏈接的方式,但它有自己的方法。創建Deferred對象後,可以使用以下任何方法,直接從對象創建鏈接或將對象保存在變量中,並在該變量上調用一個或多個方法。

我在做什麼錯?

這裏是我的代碼:

<script type="text/javascript"> 
$(document).ready(function() { 
// This works as expected - alert(20) 

var defer = new $.Deferred(); 
defer.pipe(myFunction).pipe(myFunction).pipe(myAlert); 
defer.resolve(5); 

// This does not work as expected - alert(5) 
var defer2 = new $.Deferred(); 
defer2.pipe(myFunction); 
defer2.pipe(myFunction); 
defer2.pipe(myAlert); 
defer2.resolve(5); 

}); 

var myFunction = function (value) { 
return value * 2; 
} 

var myAlert = function (value) { 
alert('The value is ' + value); 
} 
</script> 
+0

這可能是一些操作返回一個新的承諾(如'.pipe()'),因此鏈接將操作新返回的對象。 – jfriend00

回答

3

$.Deferred對象確實是可鏈接的,但在你的第二個場景中,你是不是任何鏈接;當$.Deferred被解決或被拒絕時,您只需將多個pipe分配給要獨立執行的對象$.Deferred。換句話說,你是忽略返回的Promise對象,其中包含過濾/修改後的值將被傳遞給鏈中的下一個.pipe()

docs

返回一個新的承諾,過濾的 狀態和的通過函數推遲值deferred.pipe()方法。

要實現你在你的第二個例子想要什麼,pipe所產生的Promise代替原有的$.Deferred對象:

var defer2 = new $.Deferred(); 
var promise = defer2.pipe(myFunction); 
promise = promise.pipe(myFunction); // pipe and update promise 
promise.pipe(myAlert); 
defer2.resolve(5); 

DEMO

+0

謝謝。所以在pipe()的情況下,它是字面的。 :)我接受,儘管它與上面引用的文檔不一致。這就是挑戰 - 我不知道我需要做多少次pipe()調用,所以我想知道是否有一種乾淨的方式將可變數量的函數鏈接在一起,並仍然獲得過濾行爲(使用管道()或其他)。 – AndrewH

+0

@AndrewH:是的,存儲每個中間'Promise'對象,並保持管道。這裏有一個例子:http://jsfiddle.net/kU9nz/。它和你的想法完全一樣,但通過返回的'Promise'對象進行管道。 –