2015-05-15 8 views
7

Ich möchte eine grundlegende Ajax-Anfrage durchführen, das ist alles.XhrRequest mit reflex/reflex-dom

Ich verwende reflex für das Frontend und Scotty für das Backend. Die Firefox Web Console teilt mir mit, dass die Anfrage erfolgreich war und ich sehe das erwartete Ergebnis dort. Aber die Website wechselt von Just "default" zu Nothing statt Just "success!".

Dies ist die komplette minimal Beispiel:

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 

und der Scotty Teil:

{-# 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!" 

Da die Debug-Tools mir sagen, die Anfrage war ein Erfolg, ich den Fehler vermuten, irgendwo in der Nähe von decodeXhrResponse aber Ich bin ein wenig verloren, wie ich mit dem Debugging fortfahren sollte, da es nur zu (unlesbarem) Javascript kompiliert wird.

Ich habe das Try-Reflex Nix-Skript von GitHub verwendet, um alles einzurichten und kompiliert mit ghcjs hello.hs in der Nix-Umgebung.

Edit: die Ausgabe von curl Hinzufügen:

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

Antwort

6

Mit Hilfe von #reflex-frp auf freenode finde ich eine Lösung: decodeXhrResponse mit _xhrResponse_body und mit Text für das Standard-String gearbeitet ersetzt:

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

decodeXhrResponse erwartet irgendeine Art von JSON und obwohl ich versucht habe, JSON über Scotty zu einem Punkt zu dienen, hat es immer noch nicht funktioniert.