小编典典

设计流畅的Javascript接口以抽象化AJAX的异步特性

ajax

我将如何设计一个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的异步特性。


阅读 224

收藏
2020-07-26

共1个答案

小编典典

看一下几天前Twitter工程师Dustin Diaz在@anywhere上发表的以下文章:

他谈论了一种非常好的技术,它允许您使用一个非常简单的Queue实现在异步方法上实现流利的接口,这些方法基本上是独立于回调而链接在一起的方法。

2020-07-26