我在循环中阅读了关于闭包的几篇帖子,但仍然没有真正了解如何应用于我的情况。
我在HTML中定义了三个Feed网址,并使用JavaScript承诺在准备就绪时返回响应,而不会阻止UI。我可以为每个Feed网址获取两个博客条目数据。现在,每个返回的博客条目都有其发布日期,我想将它们从最新到最旧排序。但是,当我将对象推送到数组时,我一直得到最后一个值。我知道这与闭包有关,因为我不熟悉闭包,所以我很难解决这个问题。任何帮助都非常感谢!
var itemArray = [];
var entryObj = {};
promise.then(function (response) {
var parser = new DOMParser();
xml = parser.parseFromString(response, "text/xml");
var items = xml.getElementsByTagName("item");
for (var x = 0; x < items.length && x < limits; x++) {
title = items[x].getElementsByTagName("title")[0].innerHTML;
link = items[x].getElementsByTagName("link")[0].innerHTML;
pubDate = items[x].getElementsByTagName("pubDate")[0].innerHTML;
creator = items[x].getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "creator")[0].innerHTML;
entryObj.title = title;
entryObj.link = link;
entryObj.pubDate = pubDate;
entryObj.creator = creator;
itemArray.push(entryObj);
// output: all 6 objects contain last value
console.log(itemArray);
}
});
答案 0 :(得分:1)
简而言之:在循环中移动对象创建。
这与封闭无关。问题是,你正在推动同一个对象。 您需要推送一个新对象。所以在for循环中创建对象。因此,每次获得一个新对象时,它都会被推送到数组中。
代码 -
var itemArray = [];
promise.then(function (response) {
var parser = new DOMParser();
xml = parser.parseFromString(response, "text/xml");
var items = xml.getElementsByTagName("item");
for (var x = 0; x < items.length && x < limits; x++) {
var entryObj = {};
title = items[x].getElementsByTagName("title")[0].innerHTML;
link = items[x].getElementsByTagName("link")[0].innerHTML;
pubDate = items[x].getElementsByTagName("pubDate")[0].innerHTML;
creator = items[x].getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "creator")[0].innerHTML;
entryObj.title = title;
entryObj.link = link;
entryObj.pubDate = pubDate;
entryObj.creator = creator;
itemArray.push(entryObj);
// output: Now all values are unique
console.log(itemArray);
}
});
答案 1 :(得分:0)
将var entryObj = {};
移至 for循环。