通过承诺链时更改数据结果?

Tru*_*an1 2 javascript jquery promise jquery-deferred

我试图通过jQuery迁移到使用promises.在我的原始代码中,我有一个回调参数,它接受修改后的数据:

var getRss = function (url, fnLoad) {
    $.get(url, function (data) {
        var items = [];
        $(data).find('item').each(function (index) {
            items.push({
                title: $(this).find('title').text(),
                pubDate: $(this).find('pubDate').text()
            });
        });

        fnLoad(items);
    });
}
Run Code Online (Sandbox Code Playgroud)

我尝试更改为promise,但"done"返回未修改的数据而不是解析的数据:

var getRss = function (url) {
    return $.get(url).done(function (data) {
        var items = [];
        $(data).find('item').each(function (index) {
            items.push({
                title: $(this).find('title').text(),
                pubDate: $(this).find('pubDate').text()
            });
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

然后像下面一样使用它,但我得到原始的XML版本,而不是转换为对象的修改版本:

 getRss('/myurl').done(function (data) {
      $('body').append(template('#template', data));
  });
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 7

你想使用then(阅读文档pipe,参见pipe()然后()文档与jQuery 1.8中的实际):

function getRss(url) {
    return $.get(url).then(function (data) {
        var items = [];
        $(data).find('item').each(function (index) {
            items.push({
                title: $(this).find('title').text(),
                pubDate: $(this).find('pubDate').text()
            });
        });
        return items;
    });
}
Run Code Online (Sandbox Code Playgroud)

......有点像

function getRss(url) {
    var dfrd = $.Deferred();
    $.get(url).done(function (data) {
        var items = [];
        $(data).find('item').each(function (index) {
            items.push({
                title: $(this).find('title').text(),
                pubDate: $(this).find('pubDate').text()
            });
        });
        dfrd.resolve(items);
    }).fail(dfrd.reject);
    return dfrd.promise();
}
Run Code Online (Sandbox Code Playgroud)