[英]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.