【问题标题】:Transform or replace the jquery.ajax promise转换或替换 jquery.ajax 承诺
【发布时间】:2011-06-01 23:22:06
【问题描述】:

我希望转换 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 回调似乎总是接收原始数据而不是转换数据。
我正在尝试的方法是否可行,如果可以,有人可以帮助我指出正确的方向吗?

【问题讨论】:

    标签: jquery ajax jquery-deferred


    【解决方案1】:

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

    function shapeResults( rawData ) {
        return rawData.toUpperCase();
    }
    
    function useTransformedData(data) {
        alert(data);
    }
    
    $.get( '/' )
        .pipe( shapeResults )
        .then( useTransformedData );
    

    See jsFiddle。在 jsFiddle 上进行了一些更改,但效果是一样的。

    【讨论】:

    • 天才,谢谢。值得注意的是,管道是在 1.6 中添加的,这就是为什么我在阅读 1.5 的源代码时没有发现它的原因 :)
    • 应该注意 deferred.pipe() 从 jQuery 1.8 开始被弃用,取而代之的是改进的 deferred.then(): api.jquery.com/deferred.then
    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2018-05-04
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多