7

基本的な Ajax リクエストを実行したいだけです。

reflexフロントエンドとバックエンドに使用しScottyます。Firefox Web コンソールに、リクエストが成功したことが示され、期待どおりの結果が表示されます。Just "default"しかし、ウェブサイトはからNothingではなく に切り替わりますJust "success!"

完全な最小限の例を次に示します。

import Reflex (holdDyn)
import Reflex.Dom (button, el, mainWidget, display)
import Reflex.Dom.Xhr (performRequestAsync, xhrRequest, decodeXhrResponse)
import Reflex.Class (tag, constant)
import Data.Default (def)

main :: IO ()
main = do
  mainWidget $ el "div" $ do
    buttonEvent <- button "click me"
    let defaultReq = xhrRequest "GET" "mystring" def  --served by Scotty
    asyncEvent <- performRequestAsync (tag (constant defaultReq) buttonEvent)
    buttonDyn <- holdDyn (Just "default") $ fmap decodeXhrResponse asyncEvent
    display buttonDyn

そしてそのScotty部分:

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.Static

main = scotty 3000 $ do
  middleware $ staticPolicy (noDots >-> addBase "/mnt/b/haskell/try-reflex/hello.jsexe")
  get "/" $ do
    file "/mnt/b/haskell/try-reflex/hello.jsexe/index.html"
  get "/mystring" $ html "success!"

デバッグツールはリクエストが成功したことを教えてくれるので、どこかにエラーdecodeXhrResponseがあるのではないかと思いますが、(読み取り不能な) Javascript にコンパイルされるだけなので、デバッグをどのように進めるべきか少し迷っています。

GitHub の try-reflex Nix スクリプトを使用してすべてをセットアップしghcjs hello.hs、Nix 環境でコンパイルしました。

編集:の出力を追加curl

$ curl -G http://localhost:3000/mystring
success!% 
4

2 に答える 2

6

#reflex-frpfreenode の助けを借りて、解決策を見つけました。デフォルトの文字列に置き換えdecodeXhrResponse_xhrResponse_body使用するとうまくいきました。Text

buttonDyn <- holdDyn (Just $ T.pack "default") $ fmap _xhrResponse_body asyncEvent

decodeXhrResponseある種の JSON が必要で、ある時点で Scotty 経由で JSON を提供しようとしましたが、まだ機能しませんでした。

于 2015-05-17T18:36:08.560 に答える