javascript - 在异步函数中响应设置状态

标签 javascript reactjs asynchronous promise

我使用以下异步函数通过 REST 服务验证有效的用户凭据;

async doesLoginExist(regCode) {
    if (loginCode.match(loginCodePattern)) {
      try {
        await LoginService.getUserByLoginCode();
        return {};
      } catch (err) {
        if (err.status === 404) {
          return {
            error: 'Your login code is not recognized.', success: null
          };
        }
        return {
          error: 'Service is temporarily unavailable.', success: null
        };
      }
    }
    return {};
  }

但是,当我尝试在此函数中设置某些状态时;

async doesLoginExist(regCode) {
    await this.setState({ canProceed: false });
    if (loginCode.match(loginCodePattern)) {
      try {
        await LoginService.getUserByLoginCode();
        await this.setState({ canProceed: true });
        return {};
      } catch (err) {
        if (err.status === 404) {
          return {
            error: 'Your login code is not recognized.', success: null
          };
        }
        return {
          error: 'Service is temporarily unavailable.', success: null
        };
      }
    }
    return {};
  }

它似乎不再正确地将我的 {error, success} 对象返回给调用者,该对象最终被用作屏幕上显示的验证消息。另一个小问题是输入登录代码的文本框自动聚焦也不起作用。

我应该在此函数中设置状态的其他方式吗?

最佳答案

  1. 确保 doesLoginExist 正确绑定(bind)到组件的上下文。由于缺乏信息,不能肯定地说,但这是一个很常见的问题。 Read more here 示例如何绑定(bind) doesLoginExist 本身 - 您必须在构造函数中显式执行此操作

    constructor() {
      super();
      this.doesLoginExist = this.doesLoginExist.bind(this);
    }
    
    async doesLoginExist() {
      this.setState({ canProceed: false });
      ...
    }
    
  2. 可以选择将 doesLoginExist 中的 this.setState 调用提取到另一个方法中进行重构,这将提高 doesLoginExist 的可重用性

    handleSomethingHappened = () => {
      this.setState({ canProceed: false });
      const result = await doesLoginExist(regCode)
      this.setState({ canProceed: true });
    }
    

干杯。

关于javascript - 在异步函数中响应设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46787282/

相关文章:

javascript - CSS slice/slot transition effect for/with DIVs

javascript - 使用静态字段为 React 组件创建流类型

javascript - 如何从获取的 json 数据中仅返回 set-State?

c# - 用作异步任务时出现后台服务错误

javascript - 图像jquery前面的颜色

javascript - AngularJS $window : how can it be beneficial in unit testing?(与使用 window 相比)

c# - ASP.NET 页面中的异步 C# 方法调用适用于调试,但不适用于实时站点

c# - 如何异步 Files.ReadAllLines 并等待结果?

javascript - 如何在 div 上定位 "shift keydown & click"的事件?

javascript - 为什么 renderToString 在渲染 Material-UI 组件时会抛出有关 useLayoutEffect 的错误?