🌟 Promise then方法全景式通关指南

📚 Promise快速回顾

javascript 复制代码
// 就像点外卖 🍔
const orderFood = new Promise((resolve, reject) => {
  // 厨房制作中...
  setTimeout(() => {
    const success = Math.random() > 0.3;
    success ? resolve("🍔+🍟套餐") : reject("厨师手滑了!");
  }, 2000);
});

✨ then()基础四要素

1. 基本用法

javascript 复制代码
orderFood
  .then(meal => {
    console.log(`收到:${meal}`); // 成功时执行
    return "擦桌子"; // 可以返回新值
  })
  .catch(err => {
    console.log(`投诉:${err}`); // 失败时执行
  });

2. 链式调用奥秘

javascript 复制代码
// 就像生产线流水线 🚂
orderFood
  .then(meal => {
    console.log(`打开包装:${meal}`);
    return "吃完的包装盒";
  })
  .then(trash => {
    console.log(`分类丢弃:${trash}`);
    return new Promise(resolve => setTimeout(() => resolve("收拾完毕"), 1000));
  })
  .then(finalResult => {
    console.log(finalResult); // 1秒后输出
  });

3. 错误处理大全

javascript 复制代码
// 方式1:catch统一捕获
orderFood
  .then(meal => { /*...*/ })
  .catch(err => console.log(`错误日志:${err}`));

// 方式2:then的第二个参数
orderFood.then(
  meal => { /*...*/ }, 
  err => console.log(`立即处理:${err}`)
);

// ⚠️ 两种方式的区别:
// catch会捕获前面所有then的错误
// 第二个参数只处理当前Promise的失败

4. 返回值类型详解

javascript 复制代码
// 返回值类型决定下一个then接收什么
.then(value => {
  // 情况1:返回普通值
  return "普通字符串"; // 下个then收到字符串
  
  // 情况2:返回Promise
  return new Promise(resolve => {
    setTimeout(() => resolve("新的Promise结果"), 1000);
  }); // 下个then等待1秒后收到结果
  
  // 情况3:不返回
  // 下个then收到undefined
});

🔧 实用技巧宝典

1. 快速创建Promise

javascript 复制代码
// 成功快捷方式
Promise.resolve("立即成功").then(console.log); 

// 失败快捷方式
Promise.reject("立即失败").catch(console.error);

2. 同步异步转换

javascript 复制代码
function syncToAsync() {
  return Promise.resolve().then(() => {
    console.log('这个代码会在微任务队列执行');
    return '转换完成';
  });
}

3. 多个Promise协作

javascript 复制代码
// 等待所有完成
Promise.all([promise1, promise2])
  .then(results => console.log(results));

// 竞速模式
Promise.race([request1, request2])
  .then(firstResult => {/*...*/});

💥 常见坑点预警

javascript 复制代码
// 错误示例❌
somePromise
  .then(result => {
    new Promise(resolve => setTimeout(resolve, 1000)); // 忘记return!
  })
  .then(() => {
    // 这里会立即执行,不会等待!
  });

// 正确姿势✅
somePromise
  .then(result => {
    return new Promise(resolve => setTimeout(resolve, 1000)); // 记得return!
  });

🎯 最佳实践

  1. 始终返回:每个then回调都return值/Promise
  2. 错误早处理:在链式末尾统一catch
  3. 命名Promise :变量名如userPromise增强可读性
  4. 异步转同步:用async/await+then效果更佳

🔮 实战演练

javascript 复制代码
// 模拟用户登录流程
function login(username) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      username ? resolve({ id: 123, name: username }) : reject("用户名无效");
    }, 500);
  });
}

login("前端小王子")
  .then(user => {
    console.log(`欢迎回来,${user.name}!`);
    return fetch(`/api/profile/${user.id}`); // 假设返回Promise
  })
  .then(profile => {
    console.log("加载个人资料完成:", profile);
    return "流程全部完成 ✅";
  })
  .catch(err => {
    console.error("流程出错:", err);
    return "系统维护中 ⚠️";
  })
  .then(finalMessage => {
    console.log(finalMessage);
  });

🌈 总结

then()就像连接Promise的管道工 🔧:

  1. 接收前一个Promise的结果
  2. 处理数据(可以同步/异步)
  3. 传递处理后的结果给下一个环节

记住这个流程图:
Promise -> then -> then -> catch -> finally

现在就去控制台试试这些代码吧!遇到问题推荐MDN的Promise文档

相关推荐
zeijiershuai11 分钟前
Ajax-入门、axios请求方式、async、await、Vue生命周期
前端·javascript·ajax
qingyun9896 小时前
封装AJAX(带详细注释)
前端·ajax·okhttp
积跬步,慕至千里2 天前
pyspark RDD相关常用函数使用案例
前端·javascript·ajax
Clrove.112 天前
JavaWeb——Ajax
前端·javascript·ajax
十五_在努力2 天前
【JavaScript内功系列】循序渐进理解 Promise 异步编程(一)
前端·javascript·promise
进程击序的媛4 天前
ajax之生成一个ajax的demo示例
javascript·ajax
Au_ust5 天前
React:Axios
ajax·json
青红光硫化黑6 天前
前端基础之ajax
前端·javascript·ajax
星星不打輰6 天前
使用Ajax完成与后台服务器的数据交互
服务器·ajax·交互·edge浏览器