4

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

我的大部分困惑是由于 Javascript 的异步特性。由于 AJAX 函数实际上并不返回来自 API 的响应,我该如何编写包装器以使其工作方式与同步服务器端请求有些相似?

或者这根本不可能,并且我必须为我的应用程序中对 API 的每次调用使用回调(因此包装库将毫无意义)?

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

4

2 回答 2

1

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

关于您的具体问题,从浏览器访问 reddit API 几乎可以肯定违反同源政策:您通常只能向提供原始 Javascript 的域发出 AJAX 请求。通常,当您想提供对第三方服务的客户端(基于浏览器)访问时,您可以通过服务器代理客户端请求来实现此目的。服务器应确保它只代理来自授权客户端的请求。如果您决定采用这条路线,您将使用 clojurescript 从浏览器向您的网络服务器(可能正在运行 clojure)发出异步请求,该服务器将对请求进行身份验证,然后向 reddit API 发出同步请求并将结果返回给客户。当响应准备好时,客户端将调用回调,您的代码将收到结果。

于 2013-04-26T23:44:12.460 回答
0

您正在寻找的概念被大多数编程语言称为“期货”。实现此类事情的JavaScript 库通常将期货称为“承诺”。

在 Python 中有几个实现期货的库。然而,最著名的是Twistedand是一个崭露头角的库,它很可能会成为 Python 3.4 的默认事件循环实现TornadoTulip

JavaScript 也是如此。 许多 流行的 包括 jQuery)提供了期货的实现,让你可以这样:

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

进入这个:

function doWorkAsync(errorCallback, successCallback) {
    return ajaxRequest()
        .then(processWithWebWorker)
        .then(successCallback)
        .fail(errorCallback);
}
于 2013-04-27T01:14:28.487 回答