2013-04-10 43 views
4

我主要是一名Python開發人員,但最近我一直在努力學習Clojure/ClojureScript。作爲練習,我想爲Reddit的API編寫一個ClojureScript包裝器。我如何處理api的javascript/clojurescript包裝庫?

我的大部分困惑都是由於Javascript的異步性質。由於AJAX函數實際上不會從API返回響應,因此如何編寫包裝器,使其與同步服務器端請求的工作方式有些類似?

或者這是不可能的,我必須使用回調來調用API在我的應用程序(因此包裝庫將毫無意義)?

有沒有我可以參考的類似圖書館? (Javascript/ClojureScript)

+0

http://brianmckenna.org/blog/cps_transform_js – thefrontender 2013-04-17 06:41:56

+0

而且https://開頭github.com/gregspurrier/to-be-continued – thefrontender 2013-04-17 06:46:26

+0

你可以選擇讓你的AJAX呼叫同步,會這樣做嗎? – boisvert 2013-04-19 09:10:44

回答

1

可以進行同步XHR請求,但它不是慣用的。 Javascript(和擴展的Clojurescript)使用單線程執行模型,因此長時間運行的調用通常是異步的,以避免阻止執行應用程序的其他部分。如果你正在編寫一個同步API的包裝器,你通常會爲每個API方法添加一個回調參數(並且不要忘記提供某種形式的錯誤處理)。

關於您的具體問題,從瀏覽器訪問reddit API幾乎肯定違反了same origin policy:您通常只能向服務原始Javascript的域發出AJAX請求。通常,當您想要通過客戶端(基於瀏覽器)訪問第三方服務時,可以通過通過服務器代理客戶端請求來完成此操作。服務器應確保它只代理來自授權客戶端的請求。如果你決定採用這種方式,你可以使用clojurescript向你的web服務器發送一個異步請求(可能運行clojure),它將驗證請求,然後向reddit API發出同步請求並將結果返回給客戶。當響應準備就緒時,客戶端將調用回調,您的代碼將收到結果。

+0

謝謝。關於第二段,如果reddit的API超出限制,最終會導致我的服務器阻塞? reddit客戶端如何處理這個問題? (例如iOS的Alien Blue)或者他們沒有這個問題,因爲他們不是基於瀏覽器的。 – john2x 2013-05-03 10:15:34

+0

是的,如果超過閾值,reddit的API可能會阻止您的服務器。如果你最終寫了一個受歡迎的服務,你可能可以聯繫他們,讓他們增加你的服務的限制。應用程序不受這些限制,因爲它們不在瀏覽器沙箱中運行。 – 2013-05-14 01:29:27

0

您正在尋找的概念被大多數編程語言稱爲「期貨」。 JavaScript庫that implement such things通常將期貨稱爲「承諾」。

在Python中有幾個實現期貨的庫。最爲人熟知的是TwistedTornado,但是,Tulip是一個即將到來的庫,將most likely land as the default event loop implementation for Python 3.4

在JavaScript中也是如此。 ManypopularlibrariesjQuery 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); 
} 
+1

Clojure(腳本)提供期貨作爲語言功能,但它們並不是真正想要的XHR請求,因爲它們會阻塞,直到未來可用。 – 2013-05-14 01:33:45