Promise

Promise

Promise 是异步编程的一种解决方案, 可以解决传统 Ajax 回调函数嵌套问题。

案例:模拟使用ajax连续发起两次请求

第一次请求monster.json获取到monster的id

json 复制代码
{
  "id": 1,
  "name": "黑山老妖"
}

第二次请求需要根据第一次获取到的id来获取monster的详细信息

json 复制代码
{
  "address": "阴曹地府-黑山",
  "skill": "翻江倒海功",
  "age": 800
}

传统的ajax方式:

javascript 复制代码
//jquery 发出 ajax 的方式
$.ajax({
    url: "data/monster.json",
    success(resultData) {	//如果请求成功了,回调处理函数 success
        console.log("第 1 次 ajax 请求 monster 基本信息=", resultData);
        //发出第二次 ajax 请求
        $.ajax({
            url: `data/monster_detail_${resultData.id}.json`,
            success(resultData) {
                console.log("第 2 次 ajax 请求 monster 详细信息=", resultData);
                //$.ajax => callback hell
            }, error(err) { //出错的回调函数
                console.log("出现异常=", err);
            }
        })
    }, error(err) {
        console.log("出现异常=", err);
    }
})

使用promise:

javascript 复制代码
	//1. 创建 Promise 对象
    //2. 构造函数传入一个箭头函数
    //3. (resolve, reject) 参数列表 resolve: 如果请求成功, 调用 resolve 函数
    //4. 如果请求失败, 调用 reject 函数
    //5. 箭头函数体, 仍然是通过 jquery 发出 ajax
    let p = new Promise((resolve, reject) => {
        //发出 ajax
        $.ajax({
            url: "data/monster.json", 
            success(resultData) {	//成功后回调函数
                console.log("promise1 结果 =", resultData);
                resolve(resultData);
            }, error(err) {
				//console.log("promise1 请求异常=", err);
                reject(err);
            }
        })
    })
    //这里我们可以继续编写请求成功后的业务
    p.then((resultData) => {
		//这里我们可以继续发出请求
		//console.log("p.then 得到 resultData", resultData);
        return new Promise((resolve, reject) => {
            $.ajax({
                url: `data/monster_detail_${resultData.id}.json`, 
				success(resultData) { //第 2 次 ajax 请求成功,回调函数
                    console.log("promise2 结果 =", resultData);
                    //继续进行下一次的请求
                    resolve(resultData);
                }, error(err) { //第 2 次 ajax 请求失败,回调函数
					//console.log("promise2 请求异常=", err);
                    reject(err);
                }
            })
        })
    }).then((resultData) => {
		//可以在这继续发起请求
    }).catch((err) => { //这里可以对多次 ajax 请求的异常进行处理
        console.log("promise 异步请求异常=", err);
    })

注意事项和使用细节:

  • 如果返回的是 Promise 对象,可以继续执行.then()
  • .then((data)=>{}) 的 data 数据是上一次正确执行后 resolve(data) 返回传入的
  • 通过多级.then() 可以对异步请求分层次请求,实现代码重排,代码逻辑更加清晰合理
  • 通过多级.then() 后面的 .catch((err) => {}) 可捕获发生异常,便于调试
相关推荐
free3530 分钟前
作用域链与 Environment:变量查找、遮蔽和赋值怎么实现
javascript
Momo__40 分钟前
Vite 8.1 打包开发模式——10000 组件冷启动 15 倍,"No Bundle Dev" 七年后被自己终结
前端·vue.js·vite
YHL42 分钟前
🤖 Agent 智能体开发实战 · 第一课:Tool Use —— 让大模型自动干活
前端·javascript·人工智能
Monki44 分钟前
AI 规范式 UI 设计,一键批量出页,高效落地不翻车
前端
山河木马1 小时前
渲染管线-计算得到gl_FragColor(片元着色器)之后续GPU流程
前端·webgl·计算机图形学
不想说话的麋鹿1 小时前
「项目实战」我用 Codex + GPT-5.5 + Trellis "氛围编程",独立做了一个情侣厨房小程序
前端·agent·全栈
接着奏乐接着舞。2 小时前
【2026年7月最新】69道RAG面试题
前端·人工智能·后端·aigc·embedding·rag
以和为贵2 小时前
前端也能搞懂 Agent:从 Function Calling 到自主编排
前端·人工智能·架构
HUMHSX2 小时前
Vue 组件通信核心知识点梳理
javascript·vue.js·ecmascript
风止何安啊2 小时前
🚦 前端并发请求 “交通管制”:别让你的接口堵成早高峰
前端·javascript·面试