async函数里的await为什么没按顺序执行两个API请求?
我在写一个表单提交功能,需要先检查用户名是否可用再提交注册信息。用async/await写完后发现第二个请求总是先执行,导致报错。代码逻辑明明是按顺序写的啊…
async function register() {
const check = await fetch('/check-username');
const data = await fetch('/submit-form'); // 这个先执行了!
console.log('两个都完成');
}
我尝试过把第二个await单独抽出来,但问题依旧。控制台没有报错,就是第二个请求的依赖数据没准备好。是不是async函数里的await需要特殊处理?或者fetch的用法哪里错了?
fetch的特性上,它发起请求后会立刻返回一个 promise,而不会阻塞后面的代码。虽然你用了await,但如果第一个请求的 promise 没有正确 resolve,可能是因为没有等待它的响应体被处理完成。先检查一下你的
/check-username接口是否真的返回了正确的数据,并且确认你在等待它的 response 被完全解析。改一下你的代码,像这样:重点是,
fetch不仅要等网络请求完成,还得等它的 response 被解析(比如用.json())。如果忽略了解析这一步,可能会导致看起来像是顺序乱了。顺便说一句,这种情况挺常见的,很多开发者一开始都会被
fetch的这个特性坑到。fetch的理解上。虽然你用了await,但fetch本身只等待请求发起,不会等服务端返回完整数据就继续往下走了。这就导致表面上看第二个请求“抢先”了。解决方法很简单,让第一个请求真正完成后再走下一步。改一下代码:
重点是,
fetch要连着两次await:一次等请求发起,一次等数据回来。这样就能保证顺序正确。如果服务端还有其他依赖逻辑,记得再加一层判断,别让后一个请求少了东西就瞎跑。写后端的都知道,这种依赖关系得盯紧了,不然分分钟踩坑。