我正在尝试drakma-async
在我的小项目中使用。但我就是不明白发生了什么。(我使用 emacs + slime + ccl)。我需要使用 http(s) 获取数据并在回调中解析它。我假设我可以得到无法解析的错误数据,所以我想重试。但是当我尝试进行一些测试时,我就是无法理解发生了什么......
(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)。为什么第 5 次和第 5 次测试没有任何反应?
PS 没有足够的声誉来创建drakma-async
或cl-async
标记此库。我知道这drakma-async
是建立的,drakma
所以我放了这个标签。