4

设置

我有一个(相当标准的)表单,允许用户通过输入用户名和密码来创建帐户。当#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)

谢谢你的帮助。

4

1 回答 1

3

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

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

于 2011-10-12T07:03:09.120 回答