【问题标题】:How to implement and async email verification logic?如何实现和异步电子邮件验证逻辑?
【发布时间】:2016-10-31 08:26:46
【问题描述】:

我需要实现以下内容:我有一个用户输入电子邮件的页面。每次文本更改时,我都必须检查用户是否存在于数据库中,并根据该信息将按钮的文本设置为“注册”或“登录”。问题是,这个 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 之间输入了一个有效的电子邮件,在这种情况下它永远不会被检查。

我的问题是,实现我想要实现的目标的正确方法是什么?提前致谢。

【问题讨论】:

  • 您想阻止用户在您验证时编辑文本吗?或者您想在发出新请求时取消当前请求?
  • 我确定我不想阻止用户输入文本,用户不应该关心请求。
  • 我很确定有更好的方法来做这个验证检查。并且更改文本应该无关紧要..您能否展示您当前如何检查 isValid User 例如..您应该在提交时检查此类内容..
  • @MethodMan 查看编辑
  • 你喜欢什么样的行为?旧请求被取消且不更新 UI,只有最新请求才能更新 UI?

标签: c# .net xamarin xamarin.forms mobile-development


【解决方案1】:

这是一种解决方案:

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 变量来保存每次更改文本时递增的最后一个请求号。

如果AccountExistAsync操作完成后,代码发现变量发生了变化,就会断定发出了新的请求,不会更新UI。

请注意,在尝试发送验证请求之前,该解决方案也会等待 200 毫秒。虽然这会延迟验证操作 200 毫秒,但它会防止发送过多的请求,尤其是在用户快速键入时。这当然是可选的。

编辑: 我在读取/更新 requestNumber 时删除了同步的使用,因为此类代码仅在 UI 线程中运行。

【讨论】:

  • 像魅力一样工作。但是我不太明白您为什么取消锁定,是否有可能同时处理事件?
  • 因为await(在UI事件处理程序中)之前和之后的代码运行在单线程的UI线程中(只要你不做ConfigureAwait(false))。
  • @NikaGamkrelidze,我刚刚意识到在开始时捕获mailEntry.Text 并不重要,因为我们只有在没有发出新请求时才读取它的值。是什么问题导致您通过模拟器进行的测试失败?
  • 这是我的错,你的代码运行良好,没关系,我删除了我的评论。
  • @downvoter,你能解释一下这个答案的问题吗?
猜你喜欢
  • 2011-01-10
  • 2020-04-16
  • 1970-01-01
  • 2012-02-29
  • 2011-07-26
  • 1970-01-01
  • 2018-08-26
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多