3

環境

私は ClojureScript で遊んでいるので、Ajax は次のように動作します。

(make-ajax-call url data handler);

ハンドラーは次のようになります。

(fn [response] .... )

さて、これは、「新しいデータを取得し、左側のサイドバーを更新する」のようなことを言いたい場合、最終的には次のようになります。

(make-ajax-call "/fetch-new-data" {} update-sidebar!) [1]

さて、私はこれを次のように書きたいと思います:

(update-sidebar! (make-ajax-call "/fetch-new-data" {})) [2]

しかし、make-ajax 呼び出しがすぐに戻るため、機能しません。

質問

これを機能させるために、モナドまたはマクロを使用する方法はありますか? [2] が [1] に自動書き換えされるようにするには?私は信じている:

  • [1[ に書き換えられるため、パフォーマンスが低下することはありません。
  • 非同期イベントではなく同期ステップで考えることができるので、私にとってはより明確に推論できます

    この問題に遭遇したのは私が初めてではないと思うので、これがよく知られている問題であれば、「Google for Problem Foo」という形式の回答は完全に有効です。

ありがとう!

4

4 に答える 4

1

マクロは、Ajax 呼び出しを非同期のままにして、コードの外観を変更します。これは単純なテンプレート マクロです。別のアプローチは、結果を待つ関数で make-ajax-call への呼び出しをラップすることです。これらのいずれかを機能させることができますが、少しぎこちなく、「un ajax のように」見えるかもしれません。利点は、抽象化の層を追加する価値がありますか?

于 2012-06-23T18:24:32.370 に答える
1

スレッド化マクロの使用についてはどうですか? 十分ではありませんか?

(->> update-sidebar! (make-ajax-call "/fetch-new-data" {}))
于 2012-06-23T18:24:37.803 に答える
1

これについては、seesawのasync ブランチで大まかなアイデアがありました。特にseesaw.async名前空間を参照してください。

于 2012-06-25T06:41:04.720 に答える