转换或替换jquery.ajax承诺

时间:2011-06-01 23:22:07

标签: jquery ajax jquery-deferred

我希望转换ajax调用返回的数据并将其传递给另一个插件的构造函数。我认为如果插件的选项接受了其数据的对象或返回数据的函数,这将允许我使用延迟对象为jQuery.ajax。

问题是,我需要在客户端转换数据,但无法看到如何使用jQuery.Deferred Object执行此操作。有许多不同复杂性的例子,但涉及传递和转换参数的次数并不多。

这是代表我想要实现的一些代码。

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 我正在尝试的是什么,如果是这样,有人可以帮我指出正确的方向吗?

1 个答案:

答案 0 :(得分:3)

success返回原始Deferred对象,而不是新对象。如果要转换数据,则需要deferred.pipe

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

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

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

See jsFiddle。有一些变化使它适用于jsFiddle,但效果是一样的。