2011-06-01 61 views
4

我希望能夠轉換ajax調用返回的數據並將其傳遞給另一個插件的構造函數。我認爲,如果插件的選項接受了其數據的對象或返回數據的函數,這將允許我使用延遲對象作爲jQuery.ajax。轉換或替換jquery.ajax承諾

蹭的是我需要在客戶端轉換數據,並且無法看到如何使用jQuery.Deferred對象執行此操作。有很多不同的複雜性的例子,但不是很多涉及傳遞和變換參數的例子。

這是一些代表我試圖實現的代碼。

function shapeResults(rawData) { 
    return $.Deferred(function (dfd) { 

     //transform in someway 
     var shapedData = rawData.toUpperCase(); 

     alert(shapedData); 

     //change the 'signature' from jqXHR to data 
     dfd.resolve(shapedData); 
    } 
    ).promise(); 
} 

function useTransformedData (data) { 
    //hoping for UPPERCASE data here but still getting rawData 
    alert(data); 
} 

$.get('/') 
.success(shapeResults) 
.then(useTransformedData); 

因爲它代表了useTransformedData回調似乎總是收到RAWDATA而非transformedData。
是我想要的,如果有的話可以有人幫助指向正確的方向嗎?

回答

3

success返回原始Deferred對象,而不是新的對象。如果您要變換的數據,你需要deferred.pipe

function shapeResults(rawData) { 
    return rawData.toUpperCase(); 
} 

function useTransformedData(data) { 
    alert(data); 
} 

$.get('/') 
    .pipe(shapeResults) 
    .then(useTransformedData); 

See jsFiddle。有幾個變化使它在jsFiddle上工作,但效果是一樣的。

+0

天才,謝謝。值得注意的是,管道是在1.6中添加的,這就是爲什麼我沒有發現它讀取1.5的源代碼:) – 2011-06-08 01:39:24

+0

應該注意''deferred.pipe()'不贊成使用jQuery 1.8而贊成改進'deferred.then()':http://api.jquery.com/deferred.then/ – alxndr 2013-10-28 18:17:45