2011-06-01 85 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