You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React JS中await Promise顺序异常 如何让请求按顺序执行

问题原因

执行顺序不符合预期的核心问题是:resolveAfter2Seconds 函数虽然标记为 async,但内部没有返回 fetch 生成的 Promise 链。
函数执行时只会立刻发起fetch请求,不会把请求对应的Promise对象返回给调用方。此时 await resolveAfter2Seconds() 等待的是async函数默认生成的、同步代码执行完就立刻resolve的空Promise,根本不会等待内部fetch请求走完,自然会先输出second再输出first。

修改方案

只需要给resolveAfter2Seconds内部的fetch链加上return,把需要等待的Promise暴露给调用方,await就能正确等待第一个请求全部执行完成后再走后续逻辑。
推荐统一用async/await写法减少then嵌套,修改后完整代码如下:

async function resolveAfter2Seconds() {
  // 关键:return 整个fetch Promise链,让await可以捕获到请求的执行状态
  return fetch('https://jsonplaceholder.typicode.com/todos/1')
    .then(response => response.json())
    .then(json => {
      console.log('first'); 
    })
}

async function f1() {
  // 第二个请求逻辑
  const response = await fetch('https://jsonplaceholder.typicode.com/todos/1')
  const json = await response.json()
  // 等待第一个请求执行完成
  await resolveAfter2Seconds();
  console.log('second'); 
}

const click = () => {
  f1();
}

return (
  <div className="App">
    <button onClick={click}>click</button>
    <h1>Hello CodeSandbox</h1>
    <h2>Start editing to see some magic happen!</h2>
  </div>
);

如果你习惯保留then链写法,不需要把f1改成async/await,只要给resolveAfter2Seconds里的fetch加上return,原有代码也能按预期顺序输出。核心逻辑永远是:要await某个异步操作,必须保证拿到这个异步操作对应的真实Promise对象。

内容的提问来源于stack exchange,提问作者Asking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 23:00:57