我主要是一名Python开发人员,但我最近一直在努力学习Clojure / ClojureScript。作为练习,我想为Reddit的API编写一个ClojureScript包装器。
我的大部分困惑是由于Javascript的异步性质。由于AJAX函数实际上并未从API返回响应,因此如何编写包装器以使其与同步服务器端请求的工作方式类似?
或者这根本不可能,我必须在我的应用程序中对API的每次调用使用回调(因此包装库没有意义)?
我可以参考类似的库吗? (使用Javascript / ClojureScript)
答案 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中有几个实现未来的库。最着名的是Twisted
和Tornado
,但Tulip
是一个即将推出的most likely land as the default event loop implementation for Python 3.4库。
在JavaScript中也是如此。 Many popular libraries(jQuery 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);
}