Я создаю простое приложение типа агрегатора, которое будет извлекать данные с нескольких веб-сайтов (через их API) и затем отображать данные на одной странице. Например, при поиске Джона Гришама приложение получало бы данные со своей страницы из Википедии, его книги с самым высоким рейтингом от Goodreads и страницы его автора из IMDb (и т. Д.).
Прямо сейчас у меня есть код jQuery для запроса и анализа ответа JSON от этих API отдельно, а затем для обновления страницы с помощью функций $.when
/ $.done
.
Я пытаюсь создать одну функцию, которая будет обрабатывать запросы AJAX, вместо 5-6 разных отдельных. Но так как каждый из этих сайтов имеет различную реализацию API для запроса и возврата данных, я не могу сделать универсальную функцию.
Мой подход до сих пор был где-то посередине - я создаю объект с необходимыми параметрами и функцией синтаксического анализа ответа, например:
var Search = {
wikipedia: {
url: 'http://en.wikipedia.org/w/api.php?redirects&callback=?',
param: {
page: searchQuery,
prop: 'text',
action: 'parse',
section: 0
},
template: function(response) {
$('#wikipedia').html(response.parse.text['*']);
}
},
imdb: {
url: 'http://www.imdbapi.com/?callback=?',
param: {
t: searchQuery
},
template: function(response) {
$('#imdb').html(response.Plot);
}
}
};
... и затем выполните цикл, чтобы выполнить все поиски асинхронно, и на success
выполните метод template
.
for (var eachSite in Search) {
function searchDo (site) {
$.ajax({
url: site.url,
data: site.param,
dataType: 'json',
success: site.template
});
};
searchDo(Search[eachSite]);
}
Это та часть, которую я не могу полностью обернуть. Хотя это работает, это не совсем верно. Потенциально список API для доступа будет включать около 10-15 сайтов.
Есть ли лучший способ сделать то, что я пытаюсь сделать здесь?