4

私はdrakma-async小さなプロジェクトで使用しようとしています。しかし、私は何が起こっているのか理解できません。(私はemacs +スライム+ 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)2番目のテストで得たもの:

? (run-test #'drakma-test)
"<A LOT OF HTML>
"
1

デバッガーと再起動はどこにありますか?

;(prin1 (asf:future...))3) の行のコメントを外しますdrakma-test

? (run-test #'drakma-test)
1

終了/未終了のブール値はありません。データは出力されません。再起動は行われません1。結果として得られるだけです。

(let ((reponse (das:http-request "http://www.google.com"))) ... ) 4)代わりに書き込みを行うと(asf:alet ...)、オブジェクトresponseは含まれませんfutureが、リクエストが終了してデータが含まれるまでブロックresponseされます。

? (run-test #'drakma-test-let)
1

;(prin1 (asf:future...))5) の行のコメントを外しますdrakma-test-let

? (run-test #'drakma-test-let)
NIL   ;future is not finished
1

データは印刷されません。それだけでは完了していません。実行テストの結果です。

cl-async のテストを実行しましたが、ipv6 テストを除いてすべて合格しました。だから、何が起こっているのかを理解するためにどこから始めればいいのかわからない...なぜデバッガーを取得せず、2番目のテストで再起動するのですか? 3 回目のテストで何も起こらない理由 (2 回目と同じですが、prin1 を使用)。5 回目と 5 回目のテストで何も起こらないのはなぜですか?

PSこのライブラリを作成drakma-asyncまたはタグ付けするのに十分な評判がありません。cl-async私はそれdrakma-asyncが構築されていることを知っているdrakmaので、このタグを付けました。

4

1 に答える 1

1

状況をより明確にし、状況を簡単に説明した mn のコメントに感謝します。

いくつかの例を作成し、それぞれの場合に何が起こるかを示したいと思います:

例:

(defun my-callback (&rest data)
  (format t "Echo from callback: ~A~%" data)
  (restart-case
      (error "Some error parsing data...")
    (just-continue () (prin1 "Continue..."))))

(defun my-errback (e)
  (format t "Echo from errback: ~A~%" e))

(defun make-example-future ()
  (let ((future (asf:make-future))) ;creating future
    (as:delay #'(lambda ()          ;finishing future in 2 seconds
                  (asf:future-handler-case ;wrapping asf:finish
                    (asf:finish future
                                "Result data")
                    (t (e) (asf:signal-error future e)))) ;signal future an error
              :time 2)
    future))

(defun simple-test-2 ()
  (let ((future (make-example-future)))
    (format t "Is future?: ~A~%Finished?: ~A~%"  
            (asf:futurep future) (asf:future-finished-p future))
    (asf:alet ((result future))
      (asf:attach-errback future #'my-errback)
      (format t "Finished? ~A~%" (asf:future-finished-p future))
      (asf:future-finished-p result)
      (asf:attach result #'my-callback))))

そして、ここで何が起こっているのですか:

? (as:start-event-loop #'simple-test-2)
Is future?: T 
Finished?: NIL
;<here we have a 2 sec pause>
Finished? T
Echo from errback: There is no applicable method for the generic function:
#<STANDARD-GENERIC-FUNCTION CL-ASYNC-FUTURE:FUTURE-FINISHED-P #x302001B67A8F>
when called with arguments:
("Result data")

A)asf:alet結果を待ち、結果の値を変数にバインドします。asf:aletだから、未来を縛るという考えは間違っていた。

B)make-example-futureでラップasf:finishasf:future-handler-case て使用asf:signal-errorし、エラーを将来に送信します。つまり、エラーが処理され、errbackが呼び出されます。コードの後半でコールバックがアタッチされている場合でも。また、 で囲まれたため、 でエラー(asf:future-finished-p result) が処理future-handler-caseされましたasf:alet(少なくとも私はそう思います)。

C) をコメントする(asf:future-finished-p result)と、結果は

Is future?: T
Finished?: NIL
Finished? T
Echo from callback: (Result data) ;here is my data
Echo from errback: Some error parsing data... ;;here is my error
1

をラップするdrakma-async同様のラッパーがあります。future-handler-caseasf:finish

したがって、これは#2テスト結果を説明しています。データを取得しasf:alet、文字列を返しました。コールバックからのエラーが に渡されましたがerrback、私にはありませんでした。さらに。drakma-test使用のみでは、未来にアクセスasf:aletできないため、接続できません。ではなく、errbackに電話する必要がありhttp-requestます。letalet

また、これは#3テストの結果を説明しています: I got error in (future-finished-p)which was sent to errback.

の結果を見て new#4#5テストすると、返されたすべての値でコールバックを呼び出そうとしてmy-callbackいることが わかります。そのうちの 7 つ (返される値) があります。そのため、間違った数の引数コールバックをアタッチしようとしましたが、#4 と #5 のテストはエラーを通知していましたが、それは単純にそれによって処理され、.cl-asyncdrakmadrakma:http-requestfuture-hander-caseerrback

結果: とにかく、エラーを errback に送信drakma-asyncするため、それを削除せずに再起動を使用することは不可能に思えますが、すべての再起動が失われます。future-handler-case

誰かが私の質問に直面した場合、この投稿が役立つことを願っています.

于 2014-09-29T12:23:02.787 に答える