Article
リンクに関する追加情報(embed.ly jquery APIから引き込まれた)と組み合わせて、ajax(jquery reddit APIを使用)で引き込まれたリンクからオブジェクトを作成しようとしています。
Article
オブジェクト (reddit API からのデータを含む) は、リンクの順序を保持するために push メソッドを使用して呼び出される配列に格納されますarticles
。同じi
値を使用して、reddit データの両方を繰り返し処理Article
し、配列内の どの領域にarticles
embed.ly データを格納するかを指定しています。これは、embed.ly がデータArticle
を取得するのに時間がかかるため、embed.ly データが間違ったオブジェクトに格納されるという問題があったためです。
これにより、getRedditLinks
関数が次の subreddit で再度実行されるときに問題が発生します。関数が最初のsubredditからのリンクのembed.lyデータのみを取得することi
を意味するリセット。extractEmbedlyData
コードを実行して (ここにフィドルがあります)、コンソールを見ると、私が何を意味するかがわかります - 最後の 5 つの埋め込みデータはありませんArticles
。
つまり、emded.ly は reddit と同じ速度でデータをプルしないことを念頭に置いて、両方のデータ セットが正しいArticle
オブジェクトに格納されるようにすることが課題です。
動的な名前を使用して、各サブレディットの記事配列をマスター連想配列/オブジェクトに保存しようとしましたが、ほとんど成功しませんでした。これは可能かもしれませんが、私はそれを行う方法を考え出していません。
この種の状況で動的に名前が付けられた連想配列/オブジェクトを作成する方法を知っている場合は、それを説明してください。または、より良い解決策を考えて説明したい場合、または少なくとも研究の正しい方向性を教えていただければ幸いです。
コードは次のとおりです。 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;
});
}
}