【发布时间】:2011-02-17 06:58:40
【问题描述】:
我将如何设计一个 API 来隐藏 AJAX 和 HTTP 请求的异步特性,或者基本上延迟它以提供流畅的接口。以 Twitter 的新 Anywhere API 为例:
// get @ded's 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 的异步特性。
【问题讨论】:
-
我不知道你在问什么。什么是流体接口,异步如何不流体?
-
@mike - 对于异步请求,我们为每个异步请求指定一个回调,这会破坏链接方法的流动性/流畅性。比较上面的两个例子,看看哪一个看起来流畅/流畅。
-
不是这个问题指定了 jQuery,但是using deferreds in jQuery 1.5 可以很好地抽象出这种调用......还有其他可用的延迟实现。
标签: javascript ajax asynchronous fluent-interface