Opa:如何在不阻止UI的情况下与数据库交互

时间:2011-10-12 03:10:23

标签: opa

设置

我有一个(相当标准的)表单,允许用户通过输入用户名和密码来创建帐户。当#username字段失去焦点时,将查询数据库以查看提供的用户名是否可用。

问题

一切都按预期工作,但是当onblur事件#username被触发时,用户界面将被阻止,直到数据库返回一个值。如何以异步和非阻塞的方式检查数据库?

这是我的代码(我从示例Opa项目中删除了大部分代码):

类型

@abstract type User.ref = string

type User.t = 
  { username : string
  ; passwd : string
  }

type User.map('a) = ordered_map(User.ref, 'a, String.order)

数据库

db /user : User.map(User.t)

表格

<form>
  <input id=#username type="text" onblur={_ -> username_available() } placeholder="username" />
  <input id=#password type="password" placeholder="password" />
</form>

操作

username_available() : void =
  user = Dom.get_value(#username)
  match (get_user(user)) with
  | { none } -> Log.notice("username available:", "YES")
  | { some = _ } -> Log.notice("username available:", "NO")

get_user(username : string) : option(User.t) =
  match ?/user[username] with
  | { none } -> Option.none
  | { ~some } -> Option.some(some)

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

非常好的问题。答案很简单:在@async函数之前添加username_available指令。它仍然有点实验性,因此没有记录。欢迎任何反馈!

PS。一个细节,但如果你包含简单的代码,我个人宁愿一次看到一个完整的列表(更容易复制和粘贴和运行);可能用评论代替标题。