如何为api处理javascript / clojurescript包装器库?

时间:2013-04-10 15:58:33

标签: javascript ajax clojurescript

我主要是一名Python开发人员,但我最近一直在努力学习Clojure / ClojureScript。作为练习,我想为Reddit的API编写一个ClojureScript包装器。

我的大部分困惑是由于Javascript的异步性质。由于AJAX函数实际上并未从API返回响应,因此如何编写包装器以使其与同步服务器端请求的工作方式类似?

或者这根本不可能,我必须在我的应用程序中对API的每次调用使用回调(因此包装库没有意义)?

我可以参考类似的库吗? (使用Javascript / ClojureScript)

2 个答案:

答案 0 :(得分:1)

可以进行同步XHR请求,但这不是惯用的。 Javascript(和扩展的Clojurescript)使用单线程执行模型,因此长时间运行的调用通常是异步的,以避免阻止应用程序的其他部分的执行。如果您正在编写同步API的包装器,通常会为每个API方法添加一个回调参数(并且不要忘记提供某种形式的错误处理)。

关于您的具体问题,从浏览器访问reddit API几乎肯定会违反same origin policy:您通常只能向提供原始Javascript的域发出AJAX请求。通常,当您希望提供对第三方服务的客户端(基于浏览器)访问时,您可以通过服务器代理客户端请求来执行此操作。服务器应确保它仅代理来自授权客户端的请求。如果您决定采用这种方式,那么您将使用clojurescript向浏览器发出异步请求(可能是运行clojure),该请求将对请求进行身份验证,然后向reddit API发出同步请求并将结果返回给客户。当响应准备就绪时,客户端将调用回调,您的代码将收到结果。

答案 1 :(得分:0)

您正在寻找的概念被大多数编程语言称为“未来”。 JavaScript库that implement such things通常将期货称为“承诺”。

在Python中有几个实现未来的库。最着名的是TwistedTornado,但Tulip是一个即将推出的most likely land as the default event loop implementation for Python 3.4库。

在JavaScript中也是如此。 Many popular librariesjQuery included)提供了期货的实施,让您转过身来:

function makeTwoAsyncCalls(errorCallback, successCallback) {
    ajaxRequest(errorCallback, function onSuccess(data) {
       processWithWebWorker(errorCallback, successCallback);
    });
}

进入这个:

function doWorkAsync(errorCallback, successCallback) {
    return ajaxRequest()
        .then(processWithWebWorker)
        .then(successCallback)
        .fail(errorCallback);
}