Как мне создать API, чтобы скрыть асинхронный характер запросов AJAX и HTTP, или в основном задержать его, чтобы обеспечить свободный интерфейс. Чтобы показать пример из Twitter нового Anywhere API:
// get @ded first 20 statuses, filter only the tweets that
// mention photography, and render each into an HTML element
T.User.find('ded').timeline().first(20).filter(filterer).each(function(status) {
$('div#tweets').append('<p>' + status.text + '</p>');
});
function filterer(status) {
return status.text.match(/photography/);
}
vs this (асинхронный характер каждого вызова хорошо виден)
T.User.find('ded', function(user) {
user.timeline(function(statuses) {
statuses.first(20).filter(filterer).each(function(status) {
$('div#tweets').append('<p>' + status.text + '</p>');
});
});
});
function filterer(status) {
return status.text.match(/photography/);
}
Он находит пользователя, получает свою временную шкалу твитов, фильтрует только первые 20 твитов, применяет настраиваемый фильтр и в конечном итоге использует функцию обратного вызова для обработки каждого твита.
Я предполагаю, что хорошо подобранный API, подобный этому, должен работать как построитель запросов (думаю, ORM), где каждый вызов функции строит запрос (HTTP-URL в этом случае) до тех пор, пока он не столкнется с функцией циклирования, такой как each/map/и т.д., выполняется HTTP-вызов, и передаваемая функция становится обратным вызовом.
Простым маршрутом разработки было бы сделать каждый вызов AJAX синхронным, но это, вероятно, не лучшее решение. Мне интересно выяснить способ сделать его асинхронным и по-прежнему скрывать асинхронный характер AJAX.