🍉Promise常见问题总结(进阶必会)

简介: 🍉Promise常见问题总结(进阶必会)

Promise常见问题总结


1、简单介绍一下Promise。


Promise是一种异步编程的解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。 解决了callback hell的问题,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。


三种状态:pending,fulfilled(又称resolved),rejected


2、实现一个简单的,支持异步链式调用的Promsie类。


let p = new Promsie((resolve,reject)=>{
  let num = Math.ceil(Math.random()*10)
  if (num <= 5) {
    resolve(num)
  }else {
    reject('数字太大了')
  }
})
p.then(data=>console.log(data)).catch(err=>console.error(err))
复制代码


3、Promise.then在Event Loop中的执行顺序。


JS中分为两种任务类型:宏任务和微任务。微任务执行会优先于宏任务,因为微任务执行在DOM渲染之前,宏任务执行在DOM渲染之后。


4、阐述Promsie的一些静态方法。


Promise.all、Promise.race、Promise.resolve、Promsie.reject等。


Promise.all的用法


谁跑的慢,以谁为准执行回调。all接收一个数组参数,里面的值最终都算返回Promise 对象。


// Promise的all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调
let Promise1 = new Promise((resolve,reject)=>{})
let Promise2 = new Promise((resolve,reject)=>{})
let Promise3 = new Promise((resolve,reject)=>{})
let p = Promsie.all([Promise1,Promise2,Promise3])
p
.then(()=>console.log('三个都成功'))
.catch(()=>console.log('失败'))
复制代码


Promise.race的用法


谁跑的快,以谁为准执行回调。


// race的使用场景:比如我们可以用race 给某个异步请求设置超时时间,并且在超时后执行相应的操作,代码如下:
// 请求某个图片资源
function requestImg(){
    let p = new Promise((resolve,reject)=>{
        let img = new Image();
        img.onload = function() {
            resolve(img);
        }
        img.src = '图片的路径'
    });
    return p;
}
// 延时函数,用于给请求计时
function timeout(){
    let p = new Promise((resolve,reject)=>{
       setTimeout(()=>{
           reject('图片请求超时');
       },5000)
    });
    return p;
}
Promise.race([requestImg(),timeout()])
.then(data=>console.log(data))
.catch(err=>console.log(err))
复制代码


5、Promise存在哪些缺点?


  • 1、无法取消Promise,一旦新建它就会立即执行,无法中途取消。
  • 2、如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
  • 3、吞掉错误或异常,错误只能顺序处理,即使在Promise链最后添加catch方法,依然可能存在无法捕捉的错误(catch内部可能会出现错误)
  • 4、阅读代码不是一眼可以看懂,你只会看到一堆then,必须自己在then的回调函数里面理清逻辑。


6、使用Promise进行顺序处理


推荐使用async函数配合await方式或者Array.prototype.reduce实现


  • 使用async函数


function getResult(){
 async function queue(arr) {
  let res = []
  for (let fn of arr) {
    var data= await fn();
    res.push(data);
  }
  return await res
}
queue([getA,getB])
  .then(data => {
    return addAB(data[0],data[1])
  }).then(data=>console.log(data))
}
复制代码


  • 使用Array.prototype.reduce


function runPromiseInSequence(arr, input) {
  return arr.reduce(
    (promiseChain, currentFunction) => promiseChain.then(currentFunction),
    Promise.resolve(input)
  );
}
// promise function 1
function p1(a) {
  return new Promise((resolve, reject) => {
    resolve(a * 5);
  });
}
// promise function 2
function p2(a) {
  return new Promise((resolve, reject) => {
    resolve(a * 2);
  });
}
// function 3  - will be wrapped in a resolved promise by .then()
function f3(a) {
 return a * 3;
}
// promise function 4
function p4(a) {
  return new Promise((resolve, reject) => {
    resolve(a * 4);
  });
}
const promiseArr = [p1, p2, f3, p4];
runPromiseInSequence(promiseArr, 10)
  .then(console.log);   // 1200
复制代码


7、如何停止一个Promise链?


在要停止的promise链位置添加一个方法,返回一个永远不执行resolve或者reject的Promise,那么这个promsie永远处于pending状态,所以不会向下执行then或catch了。这样就停止了一个promise链。


Promsie.stop = function() {
  return new Promsie(function(){})
}
复制代码


8、Promise链上最后一个Promise出错了怎么办?


我们都知道catch方法在promise链式调用的末尾调用,用于捕获链中的错误信息,但是catch方法内部也可能出现错误,所以在可以在promise实现中增加一个done方法,done相当于提供了一个不会出错的catch方法,并且不再返回一个promise,可以用来结束一个promise链。


done() {
    this.catch(reason => {
      console.log('done', reason);
      throw reason;
    });
  }
复制代码


9、Promise存在哪些使用技巧或者最佳实践?


  • 1、链式promsie要返回一个promise.而不只是构造一个promise。
  • 2、合理的使用Promise.all和Promise.race等方法。
  • 3、在写promise链式调用的时候,then方法不传reject函数,需要捕获promsise发生的错误,只需要在末尾加一个catch即可,如果catch()代码也又出现错误的可能,需要在链式调用的末尾增加done()函数。


最后


关于Promise的资料还有很多,Promise是异步编程重中之重,最后希望大家能熟练掌握Promise~


⚽本文介绍了常见Promisezhi知识点以及一些常见问题的解决方案~

⚾如果这篇文章对你有帮助的话,麻烦点赞收藏哟~

相关文章
|
2月前
|
运维 数据可视化 机器人
WhatsApp、LINE、Telegram 怎么选?2026 出海企业沟通指南
WhatsApp、LINE、Telegram虽同为聊天工具,但定位迥异:WhatsApp是全球企业消息基础设施,LINE深耕日台泰官方账号运营,Telegram则强于内容分发与大型社区管理。选型关键在目标市场、用户关系模式、内容类型及合规成本。
606 0
|
5月前
|
缓存 运维 监控
当你的 Agent 会“多轮思考”,Trace 却还停留在单轮:阿里云 CMS OpenClaw 可观测插件升级
阿里云 OpenClaw 可观测插件新版本上线!解决行业通病,还原完整链路信息:多轮 LLM 分段还原真实决策链路、STEP Span 让"第几轮"可观测、并发断链/串链显著修复、AGENT 指标稳定可量化。从"有图可看"升级到"支撑决策",排障、成本治理、并发验证全面提效。
588 45
|
3月前
|
弹性计算 前端开发 Ubuntu
阿里云服务器ECS的租用教程和简单的前端页面部署
本文详解阿里云学生福利领取(含300元卡券)及ECS轻量服务器选购与部署全流程:涵盖学生机免费申领、配置选型建议(Ubuntu/CentOS/Windows)、安全组设置、Nginx安装、网页部署及Xshell远程连接等实操步骤,新手友好。
493 8
|
10月前
|
存储 SQL 缓存
|
6月前
|
传感器 算法 数据可视化
动态窗口法(DWA)二维路径规划MATLAB实现
动态窗口法(Dynamic Window Approach, DWA)是一种高效的局部路径规划算法,适用于移动机器人在动态环境中的实时导航。它通过动态计算速度空间窗口,评估多条候选轨迹,选择最优路径避开障碍物并接近目标点。
891 4
|
7月前
|
人工智能 自然语言处理 监控
大型企业怎么做数据治理?(2026年2月最新)
2026年,数据治理迈入深水区。瓴羊Dataphin作为智能“数据大脑”,融合AI建模、企业语义层、流批一体与全景资产管理,协同Quick BI(对话式分析)和Quick Audience(隐私计算营销),打通“采建管—用运营”全链路,助力大型企业构建“读得懂、反应快、融得通”的数智治理体系。(239字)
|
7月前
|
数据采集 大数据 API
大模型微调 PPO 原理:从理论到实践的入门指南
本文手把手带你用LLaMA-Factory Online平台,实战PPO微调Llama-2-7b,打造专属技术文档文案助手。涵盖环境配置、高质量偏好数据构建、奖励模型训练与PPO全流程,零GPU基础也能完成——聚焦API/大数据脚本说明场景,强调精准、严谨、可操作,真正实现“学完即用”。
|
7月前
|
人工智能 自然语言处理 前端开发
写了10万行代码,却毁在配色上?这套指令让后端直男秒变设计总监
这是一篇专为后端及全栈开发者定制的实用指南,旨在解决开发者“代码强但审美弱”的痛点。文章提供了一套核心AI指令,能将DeepSeek等AI变成专业UI设计顾问,快速生成符合大厂规范(Design Token)的配色体系。通过一个后台管理系统的实战案例,演示了如何用AI将“土味”界面瞬间升级为专业级UI,让开发者无需学习设计理论也能搞定高颜值配色。
823 4
|
8月前
|
机器学习/深度学习 算法 小程序
从 GAN 到 Diffusion:移动端图像去水印算法的“算力突围”实战解析
深度解析图像修复(Image Inpainting)技术的演进。探讨如何在微信小程序 2MB 包体积限制下,利用 Serverless 架构实现快速去水印推理。“香蕉一键去水印”的技术架构案例分析。

热门文章

最新文章