JavaScript Promise 的立即执行问题

今天在练习高并发任务,发现我对于Promise的执行时机有所误解,需求是构建一个任务数组用于后续按需执行。

问题代码

js 复制代码
    const mockUserDataTask = (id) =>
      new Promise((resolve) =>{
        console.log(`用户数据 ${id} 加载中`),
        setTimeout(() => resolve(`用户数据 ${id} 加载完成`), 3000)
      });

		 const test = [
		  { id: "task-1", func: mockUserDataTask(1) },
		  { id: "task-2", func: mockUserDataTask(2) },
		  { id: "task-3", func: mockUserDataTask(3) },
		  { id: "task-4", func: mockUserDataTask(4) },
		];

    test[0].func.then((res) => {
      console.log(res);
      test[2].func.then((res) => {
        console.log(res);
      });
    });

    test[1].func.then((res) => {
      console.log(res);
      test[3].func.then((res) => {
        console.log(res);
      });
    });

预期执行顺序:

先启动任务1和任务2,完成后启动任务3和任务4

实际执行顺序:

所有4个任务同时启动


为什么会同步加载4个Promise 对象?

Promise 对象在创建时会立即执行。

💡 这是因为Promise的构造函数部分是同步执行的,传入的 executor 函数会立即调用;而resolve/reject回调的(.then()/.catch())是异步的属于Microtask(微任务)

  • 当我直接调用 mockUserDataTask(id) 时,Promise 构造函数会立即执行
  • 这意味着我在创建 test 数组时,4个 Promise 已经同时开始执行(包括它们的 setTimeout
  • 所以会立即看到所有4个"加载中"

采用闭包的方式解决这一问题:

  • 外层函数返回的是一个新的函数,而不是直接返回Promise
  • 只有在调用 func() 时才会创建并执行Promise

正确写法

// ❌ Promise立即执行 const task = new Promise(executor);

// ✅ 延迟执行(闭包) const createTask = () => new Promise(executor);

js 复制代码
	  //使用闭包有效解决
	  const mockUserDataTask = (id) => () => new Promise((resolve) => {
      console.log(`用户数据 ${id} 加载中`)
      setTimeout(() => {
          console.log('执行了')
          resolve(`用户数据 ${id} 加载完成`)
      }, 3000)
    });
    
    test[0].func().then((res) => {
      console.log(res);
      test[2].func().then((res) => {
        console.log(res);
      });
    });
相关推荐
Tanjia_kiki1 小时前
谷歌浏览器中F12编辑并重发请求
开发语言·前端·javascript
honkun61 小时前
vue 表格组件 vxe-table 实现拖拽列字段自动生成透视表汇总
前端·javascript·vue.js
IMPYLH2 小时前
HTML 的 <p> 元素
前端·javascript·html
leoZ2312 小时前
第 4 篇:布局骨架——页面壳、栅格、卡片
前端·javascript·vue.js·opencv·计算机视觉·数据挖掘·语音识别
何以解忧,唯有..2 小时前
Vue 3 模板语法详解:从插值到指令的完整指南
前端·javascript·vue.js
EasyGBS2 小时前
从接入到稳定播放:无插件直播H5视频流媒体播放器EasyPlayer.js如何撑起Web端流媒体
开发语言·前端·javascript
Carl_奕然2 小时前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型
名为沙丁鱼的猫7292 小时前
React/JSX 编码规范
前端·javascript·react.js
Highcharts.js2 小时前
甘特图纵向任务、横向时间显示图表可视化开发|Highcharts甘特图示例
开发语言·前端·javascript·可视化·甘特图·数据可视化·highcharts