Опа: как взаимодействовать с базой данных, не блокируя пользовательский интерфейс - PullRequest
4 голосов
/ 12 октября 2011

Настройка

У меня есть (довольно стандартная) форма, которая позволяет пользователю создать учетную запись, введя имя пользователя и пароль. Когда поле #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 Ответ

3 голосов
/ 12 октября 2011

Очень хороший вопрос.Ответ довольно прост: добавьте директиву @async перед вашей username_available функцией.Это все еще несколько экспериментально и поэтому не зарегистрировано.Любые отзывы приветствуются!

PS.Подробно, но если вы включите простой код, лично я предпочел бы увидеть полный список за один раз (его легче скопировать, вставить и запустить);возможно с комментариями вместо заголовков.

...