我正在尝试Article
从使用 ajax 拉入的链接(使用 jquery reddit api)结合有关链接的额外信息(从 embed.ly jquery api 拉入)创建对象。
对象(包含来自 reddit api的Article
数据)存储在使用 push 方法调用的数组articles
中,以保留链接的顺序。我使用相同的i
值来遍历 reddit 数据并指定在数组中的哪个Article
位置 articles
存储 embed.ly 数据。这是因为我遇到了将 embed.ly 数据存储在错误Article
对象中的问题,因为 embed.ly 获取数据需要时间。
getRedditLinks
当函数为下一个 subreddit 再次运行时,这会产生问题。i
重置意味着该函数extractEmbedlyData
仅从第一个 subreddit 获取链接的 embed.ly 数据。如果您运行代码(这里是一个小提琴)并在控制台中查看,您会明白我的意思 - 最后 5 个没有嵌入数据Articles
。
所以挑战在于,记住 emded.ly 不会以与 reddit 相同的速率提取数据,以确保两组数据都存储在正确的Article
对象中。
我尝试使用动态名称将每个 subreddit 的文章数组存储在主关联数组/对象中,但收效甚微。这可能是可能的,但我还没有弄清楚如何去做。
如果您知道如何在这种情况下创建动态命名的关联数组/对象,请您向我解释一下。或者,如果您能想到一个更好的解决方案并想解释它,或者至少为我指出正确的研究方向,我们将不胜感激。
这是代码:HTML:
<script src="http://cdn.embed.ly/jquery.embedly-3.1.1.min.js"></script>
JavaScript:
//Set embed.ly default key
$.embedly.defaults.key = 'a1206fe3b4214b3483b27db1a0a4f2e4';
//An array of subreddits which will eventually be generated from user input.
var userInput = ["nottheonion", "offbeat"]
//Iterate throught the userInputs, runnning the getRedditLinks function on each one.
for (var i = 0; i < userInput.length; i++) {
getRedditLinks(userInput[i]);
};
//Declare articles array where the Article objects will be stored
var articles = [];
//Article constructor
function Article(url, title, subreddit) {
this.url = url;
this.title = title;
this.description;
this.imgsrc;
this.rank;
this.subreddit = subreddit;
}
//Get Reddit URLs, titles and votes from a subreddit using JSON and store in new Articles. Push the Articles to the article array.
function getRedditLinks(subredditInput) {
$.getJSON(
"http://www.reddit.com/r/" + subredditInput + ".json?jsonp=?",
function foo(data) {
var ddc = data.data.children;
for (i = 0; i < 5 && i < ddc.length; i++) {
articles.push(new Article(ddc[i].data.url, ddc[i].data.title, ddc[i].data.subreddit));
//Run the embedly extract function on all the urls in the array.
extractEmbedlyData(articles[i].url, i)
}
console.log(articles);
});
//Extract embedly data and add to Articles.
function extractEmbedlyData(url, i) {
$.embedly.extract(url).progress(function (data) {
articles[i].description = data.description;
articles[i].imgsrc = data.images[0].url;
articles[i].rank = i;
});
}
}