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 に答える