我正在尝试通过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);
});
}
我尝试更改为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()
});
});
});
}
然后像下面那样使用它,但我得到原始的XML版本,而不是转换为对象的修改版本:
getRss('/myurl').done(function (data) {
$('body').append(template('#template', data));
});
答案 0 :(得分:7)
您想使用then
(请阅读pipe
的文档,请参阅pipe() and then() documentation vs reality in 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;
});
}
...就像
一样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();
}