我有一个(相当标准的)表单,允许用户通过输入用户名和密码来创建帐户。当#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)
感谢您的帮助。
答案 0 :(得分:3)
非常好的问题。答案很简单:在@async
函数之前添加username_available
指令。它仍然有点实验性,因此没有记录。欢迎任何反馈!
PS。一个细节,但如果你包含简单的代码,我个人宁愿一次看到一个完整的列表(更容易复制和粘贴和运行);可能用评论代替标题。