我正在嘗試在我的小型項目中使用drakma-async
。但我無法理解發生了什麼。 (我使用emacs + slime + ccl)。我需要用http(s)獲取數據並在回調中解析它。我假設我可以得到無法解析的錯誤數據,所以我想重試。但是,當我試圖做一些測試,我只是不明白髮生了什麼......使用drakma異步和cl異步的不可預知的行爲
(defun my-callback (data)
(prin1 data)
(restart-case
(error "Some error parsing data...")
(just-continue() (prin1 "Continue..."))))
(defun simple-test()
(let ((future (asf:make-future)))
(as:delay #'(lambda() (asf:finish future "Some data")) :time 2)
(prin1 (asf:future-finished-p future))
(asf:attach future #'my-callback)))
(defun drakma-test()
(asf:alet ((response (das:http-request "http://www.google.com")))
;(prin1 (asf:future-finished-p response))
(asf:attach response #'my-callback)))
(defun drakma-test-let()
(let ((response (das:http-request "http://www.google.com")))
;(prin1 (asf:future-finished-p response))
(asf:attach response #'my-callback)))
(defun run-test (test)
(as:start-event-loop test))
1)所以我會這就是我和我的簡單的例子(這是我的計劃是什麼)
? (run-test #'simple-test)
NIL"Some data" ;I get debugger here with simple-error and choose my restart
Invoking restart: #<RESTART JUST-CONTINUE #x7F0578EC20AD>
"Continue..."
1
2)這裏是我所得到的第二個測試:
? (run-test #'drakma-test)
"<A LOT OF HTML>
"
1
哪裏是我的調試器和我重新開始?
3)取消對;(prin1 (asf:future...))
線drakma-test
? (run-test #'drakma-test)
1
沒有完成/未完成布爾,無數據不打印,我沒有得到一個重新開始,我只是得到1
作爲結果。
4)我假定如果我寫(let ((reponse (das:http-request "http://www.google.com"))) ...)
instad的(asf:alet ...)
的response
將包含不future
對象,但是將阻塞,直到該請求將被完成,response
將包含的數據。
? (run-test #'drakma-test-let)
1
5)取消對;(prin1 (asf:future...))
線drakma-test-let
? (run-test #'drakma-test-let)
NIL ;future is not finished
1
未打印的數據,只是未完成和運行試驗的結果。
我已經爲cl-async運行了測試,它們都通過了,除了ipv6測試。所以我只是不知道從哪裏開始瞭解發生了什麼......爲什麼我沒有調試器並在第二次測試中重新啓動?爲什麼在第三次測試中什麼都沒有發生(這與第二次相同,但與prin1相同)。爲什麼在第五次和第五次測試中什麼也沒發生
P.S.沒有足夠的信譽爲此庫創建drakma-async
或cl-async
標籤。我知道drakma-async
是建立在drakma
,所以我把這個標籤。
對於#2,在das:http-request中有一個'future-handler-case',在你看到它之前處理'my-test'的錯誤。 #3大致是相同的問題:'das:future-finished-p'錯誤,因爲響應是一個字符串而不是未來。在#4中,錯誤在於'my-test'沒有足夠的參數,並且因爲同樣的原因而被隱藏。我不清楚cl-async是否足以說明它是如何工作的。我注意到'(push:future-debug * features *)'讓一些錯誤冒起來了,但你似乎仍然失去了重新啓動。 – 2014-09-27 09:50:24