Как хранить данные JSON из двух источников в объектах javascript, когда данные загружаются с разной скоростью?

Я пытаюсь создать Article объекты из ссылок, извлеченных с помощью ajax (используя API jquery reddit) в сочетании с дополнительной информацией о ссылках (извлеченной из API jquery embed.ly).

Article объекты (содержащие данные из API Reddit) хранятся в массиве с именем articles используя метод push, чтобы сохранить порядок ссылок. Я использую то же самое i значение, чтобы перебирать как данные Reddit и диктовать, в котором Article в пределах articles массив для хранения данных embed.ly. Это связано с тем, что у меня возникли проблемы с неправильным хранением данных. Article объект из-за времени, необходимого для получения данных.

Это создает проблему, когда getRedditLinks функция запускается снова для следующего subreddit. i сбрасывает значение extractEmbedlyData Функция только получает данные embed.ly для ссылок из первого субредита. Если вы запустите код ( здесь - скрипка) и посмотрите в консоли, вы поймете, что я имею в виду - для последних 5 нет встроенных данных. Articles,

Таким образом, проблема заключается в том, что emded.ly не будет извлекать данные с той же скоростью, что и Reddit, чтобы гарантировать, что оба набора данных хранятся в правильном Article объект.

Я попытался сохранить массив 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;
        });
    }
}

1 ответ

Решение

Мог просто передать фактическое Article Возражать extractEmbedlyData вместо индекса

for (i = 0; i < 5 && i < ddc.length; i++) {
    var article=new Article(ddc[i].data.url, ddc[i].data.title, ddc[i].data.subreddit);
     articles.push(article);
     extractEmbedlyData(article)

}

function extractEmbedlyData(article) {
        $.embedly.extract(article.url).progress(function (data) {
            article.description = data.description;
            article.imgsrc = data.images[0].url;
            article.rank = i;
        });
    }
Другие вопросы по тегам