我将如何设计一个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/); }
与此相对(每个呼叫的异步性质都清晰可见)
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/); }
它找到用户,获取其tweet时间轴,仅过滤前20条tweet,应用自定义过滤器,最终使用回调函数处理每个tweet。
我想这样设计良好的API应该像查询生成器(认为是ORM)那样工作,其中每个函数调用都会生成查询(在这种情况下为HTTP URL),直到遇到诸如each / map / etc之类的循环函数为止,进行HTTP调用,传入的函数成为回调。
一个简单的开发途径是使每个AJAX调用同步,但这可能不是最佳解决方案。我有兴趣想出一种使它异步的方法,并且仍然隐藏AJAX的异步特性。
看一下几天前Twitter工程师Dustin Diaz在@anywhere上发表的以下文章:
他谈论了一种非常好的技术,它允许您使用一个非常简单的Queue实现在异步方法上实现流利的接口,这些方法基本上是独立于回调而链接在一起的方法。