我正在尝试在我的小型项目中使用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