繁体   English   中英

如何在ASP.NET Core API中等待异步执行?

[英]How to await execution of async in ASP.NET Core API?

我正在使用ASP.NET Core API来创建一个API,供我使用依赖Redux和Sagas的React应用程序在客户端使用。 关键是,在客户端应用程序中的某个地方,我一个接一个地执行两个API调用。 一种是注册新用户,第二种是注册用户在表单中指定的新公司,并将新注册的用户添加到该组织。 因此,它基本上在后端调用了两个方法。

我首先注册的注册函数如下所示:

[AllowAnonymous]
[HttpPost("~/api/account/register")]
public async Task<IActionResult> Register([FromBody]RegisterViewModel model)
{
    var user = new MyUser
    {
        UserName = model.Email,
        Email = model.Email,
    };

    var result = Task.Run(async () => { return await _userManager.CreateAsync(user, model.Password); }).Result;
    if (result.Succeeded)
    {
           // Partially removed for brevity.
    }
}

在第二个API调用中调用的另一个方法如下所示:

[HttpPost]
public async Task<IActionResult> Post([FromBody]OrganizationModel model)
{
    // Partially removed for brevity.
    try
    {
        var org = _mapper.Map<OrganizationModel, Organization>(model);

        var user = await _userManager.GetUserAsync(HttpContext.User);
        if (user == null) return BadRequest(ErrorMapper.MapError("post_failed"));

        org.Admins.Add(user);

        _repository.Add(org);
        var result = await _repository.SaveAllAsync();
        if (result) return Created($"/api/organizations/{org.Id}", _mapper.Map<Organization, OrganizationModel>(org));
        else return BadRequest(ErrorMapper.MapError("post_failed"));
    }
    catch (Exception ex)
    {
        _logger.LogError($"Failed to add a new organization: {ex}");
    }
}

因此,基本上,如您在第二种方法中所看到的,我想要获取当前用户(请注意,注册用户后,我会自动登录该用户),然后将当前用户添加到组织的管理员列表中。

经过一些调试后,我注意到,调用了Register方法,并调用了以var result = ...开头的类似内容,但是if (result.Succeeded)未调用if (result.Succeeded)的下一行, if (result.Succeeded)它将立即跳至第二行显示的方法,它将继续执行直到到达var user = ...为止,此时将没有用户登录,并且user为null,因此它将退出此方法并移回Register方法,并继续执行行if (result.Succeeded) 我希望在执行第二个方法之前先执行整个Register方法。 在转移到另一个方法之前,如何等待Register方法完全执行?

编辑:

客户端代码如下所示:

if (!error) {
    // Partially removed for brevity.
    const user = {
        email: emailInput,
        password: passwordInput,
        confirm_password: confirmInput,
    };
    signup(user);

    const org = {
        name: newOrganizationInput,
    };
    addOrganization(org);

    this.resetState();
}

您使用await关键字await异步方法的执行。 但是,您的问题不在于后端,而在于客户端。

JavaScript中的fetch / AJAX调用是异步的。 因此,无论后端是否等待都没有关系,客户端仍然可以同时访问两个端点。

您可能正在执行以下操作:

fetch('/api/account/register', { ... });
fetch('/api/organizations', { ... });

fetch方法异步执行并返回promise。 您需要做的是:

await fetch('/api/account/register', { ... });
await fetch('/api/organizations', { ... });

要么

fetch('/api/account/register', { ... }).then(x =>
  fetch('/api/organizations', { ... });
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM