在Elm中,您可以使用Json.decode
和Http package
來請求json數據。我的嘗試是定期查找電子郵件(from this url)。定時器操作確實有效(我用簡單的計數器試了一下)。榆樹Json請求不起作用?
我已經使用this example和this SO question作爲參考。
現在類型:
type alias Email = { title: String, ... }
type Action =
NoAction
| TickCounter -- TODO rem
| AddEmails (List Email)
然後,主+狀態+行動......
main: Signal Html
main = Signal.map (view actions.address) state
state: Signal Model
state = Signal.foldp update makeEmptyModel input
-- handle inputs (merging signals)
input : Signal Action
input =
Signal.mergeMany
[ actions.signal
-- , other actions
, Signal.map checkForNewMails (Time.every (Time.minute/6.0)) -- TODO precise timer (quick test)
]
actions: Signal.Mailbox Action
actions = Signal.mailbox NoAction
update: Action -> Model -> Model
update action model =
case action of
NoAction -> model
TickCounter -> { model | count = model.count + 1 }
AddEmails newMails -> { model | emails = newMails }
checkForNewMails: Time -> Action
checkForNewMails t =
let mails = startGettingEmailData
in TickCounter -- TODO replace with AddEmails using mails
的TickCounter
是動作,這是我用來測試我的工作時序。但問題是startGettingEmailData
。它使用下一個片段,但它不會觸發任何JSON請求(我通過控制檯檢查過它)。一旦解決,我可以將mails
轉換爲一個動作,以便我可以在模型中添加電子郵件。
-- url to json
jsonUrl = "https://dl.dropboxusercontent.com/u/14070433/temp.json"
-- get emails
startGettingEmailData: Task Http.Error (List Email)
startGettingEmailData = Http.get emailJsonDecoder jsonUrl
emailJsonDecoder: Json.Decoder (List Email)
emailJsonDecoder =
let makeEmail = Json.object4
(\ti fr da bo -> makeNewEmail -1 ti fr da bo)
("title" := Json.string)
("from" := Json.string)
("date" := Json.string)
("body" := Json.string)
in
"emails" := Json.list makeEmail
我的代碼有問題嗎?如果沒有,那麼是否有辦法檢查Http.Error內容? (也許問題不在於我的代碼,但在網絡中,但我可以通過瀏覽器訪問Dropbox文件...)
我該如何觸發一個端口?你能給個例子嗎 ? – KarelG
@KarelG:我用示例代碼更新了我的答案 –
謝謝!看起來你可以將信號綁定到可以在其上運行的端口,只有在有數據時才發送信號。儘管我有一個誤解,但我認爲如果我閱讀[this],我必須包含JavaScript(http://elm-lang.org/guide/interop#ports)。 – KarelG