私は以下を実装する必要があります:ユーザーが電子メールを入力するページがあります。テキストが変わるたびに、ユーザーがDBに存在するかどうかをチェックし、その情報に基づいてボタンのテキストを「サインアップ」または「サインイン」に設定する必要があります。問題は、このDBリクエストには数秒かかることがある(理由は無関係です)APIは非同期なので、イベントハンドラはasync
で装飾され、メールエントリは何度か変更される可能性があるため、このハンドラはいくつか呼び出されますいずれかが終了する前に時間。だから私は同時のAPI要求をして、潜在的に、ボタンのテキストを変更しようと同時に試み、それはうまく終了しないことがあります。私はこのような何かを考えた:電子メール検証ロジックを実装して非同期化する方法は?
private async void OnTextChanged(object sender, TextChangedEventArgs e)
{
mailEntry.TextChanged -= OnTextChanged;
...
submitButton.Text = (await api.AccountExistAsync(mailEntry.Text)).IsRegistered
? "Sign in"
: "Sign up";
...
mailEntry.TextChanged += OnTextChanged;
}
しかし、この設計の問題は、たとえば、有効な電子メールは、それがチェックれることは決してないだろう。その場合には、-= OnTextChanged
と+= OnTextChanged
の間で入力された、ということです。
私の質問は、達成しようとしていることを実装する正しい方法は何ですか?前もって感謝します。
private long requestNumber;
private async void OnTextChanged(object sender, TextChangedEventArgs e)
{
var text = mailEntry.Text;
long myRequestNumber = ++requestNumber;
await Task.Delay(200);
if (requestNumber != myRequestNumber)
return;
var result = (await api.AccountExistAsync(text)).IsRegistered;
if (requestNumber != myRequestNumber)
return;
submitButton.Text = result ? "Sign in" : "Sign up";
}
は、それはあなたがテキストを変更するたびにインクリメントされ、最後のリクエスト数を保持するrequestNumber
変数を維持します。
検証中にユーザーがテキストを編集しないようにしますか?または、新しいリクエストが発行されたときに現在のリクエストをキャンセルしますか? –
私は、ユーザーがテキストを入力することを防止したくないと確信していますが、ユーザーは要求に気を付けるべきではありません。 – nicks
この妥当性チェックを行うにはより良い方法があると確信しています。テキストの変更は問題ではありません。あなたが現在isValid Userかどうかをチェックしているかどうかを示すことができますか?Submitでこのタイプのものをチェックする必要があります。 – MethodMan