我该如何使用一个javascript/clojurescript的封装库来调用api?

4
我主要是一名Python开发人员,但最近一直在尝试学习Clojure/ClojureScript。作为练习,我想为Reddit的API编写一个ClojureScript的封装器。
我的大部分困惑都源自Javascript异步的性质。由于AJAX函数实际上不会返回API的响应,那么我该如何编写这个封装器,使其能够与同步服务器请求类似地工作?
或者这根本不可能,我必须在我的应用程序中为每个调用API使用回调函数(因此,封装器库将是无意义的)?
是否有类似的库可供参考?(Javascript/ClojureScript)

http://brianmckenna.org/blog/cps_transform_js - thefrontender
同时请访问 https://github.com/gregspurrier/to-be-continued。 - thefrontender
你可以选择将AJAX调用同步进行,这样可以吗? - boisvert
2个回答

1
可以进行同步XHR请求,但这并不符合惯例。Javascript(以及Clojurescript)使用单线程执行模型,因此长时间运行的调用通常是异步的,以避免阻塞应用程序的其他部分的执行。如果您正在编写同步API的包装器,则通常会为每个API方法添加回调参数(别忘了提供某种形式的错误处理)。
关于您的具体问题,从浏览器访问reddit API几乎肯定违反same origin policy:通常只能向提供原始Javascript的域发出AJAX请求。通常,当您想要提供基于浏览器的客户端访问第三方服务时,您通过代理客户端请求通过您的服务器来实现这一点。服务器应确保仅代理来自授权客户端的请求。如果您决定采取这种路线,您将使用clojurescript从浏览器异步请求到您的Web服务器(可能运行clojure),该服务器将对请求进行身份验证,然后对reddit API进行同步请求,并将结果返回给客户端。当响应准备好时,客户端将调用回调函数,您的代码将接收结果。

谢谢。关于第二段,如果超过限制reddit的API最终会阻止我的服务器吗?Reddit客户端如何处理这个问题?(例如iOS的Alien Blue)或者他们没有这个问题,因为他们不是基于浏览器的。 - john2x
是的,Reddit的API可能会阻止您的服务器,如果您超过了他们的阈值。如果您最终编写了一个受欢迎的服务,您可以联系他们并要求增加您的服务限制。应用程序不受这些限制的约束,因为它们不在浏览器沙箱中运行。 - Stephen Nelson

0
你要找的概念在大多数编程语言中被称为“futures”。实现这种功能的JavaScript库通常将futures称为“promises”。 在Python中,有几个实现futures的库。最著名的是Twisted和Tornado,然而Tulip是一个新兴的库,很可能成为Python 3.4默认事件循环的实现。
在 JavaScript 中也是同样的情况。许多受欢迎的库(包括 jQuery)提供了实现 future 的功能,让你可以将这段代码转换成:
function makeTwoAsyncCalls(errorCallback, successCallback) {
    ajaxRequest(errorCallback, function onSuccess(data) {
       processWithWebWorker(errorCallback, successCallback);
    });
}

转换成这个:

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

1
Clojure(script)提供了future作为一种语言特性,但它们并不适用于XHR请求,因为它们会阻塞直到future可用。 - Stephen Nelson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接