🍉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知识点以及一些常见问题的解决方案~

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

相关文章
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
231 2
|
6天前
|
人工智能 安全 API
CoPaw:5分钟部署你的 AI助理
源自阿里巴巴开源生态的个人 AI 助理——CoPaw。作为阿里倾力打造的开源力作,CoPaw 完美打通钉钉、飞书、Discord 等多平台对话通道,支持定时任务自动化。内置 PDF/Office 深度处理、新闻摘要等强大技能,更开放自定义扩展接口。坚持数据全程私有化部署,绝不上传云端,让每一位用户都能在大厂技术加持下,拥有安全、专属的智能助手。
|
9天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
10478 81
|
7天前
|
人工智能 安全 JavaScript
阿里云上+本地部署OpenClaw(小龙虾)新手攻略:解锁10大必备Skills,零基础也能玩转AI助手
2026年,开源AI代理工具OpenClaw(昵称“小龙虾”)凭借“能实际做事”的核心优势,在GitHub斩获25万+星标,成为现象级AI工具。它最强大的魅力在于可扩展的Skills(技能包)系统——通过ClawHub插件市场的数百个技能,能让AI助手从简单聊天升级为处理办公、学习、日常事务的全能帮手。
6159 18
|
8天前
|
人工智能 自然语言处理 机器人
保姆级教程:Mac本地搭建OpenClaw及阿里云上1分钟部署OpenClaw+飞书集成实战指南
OpenClaw(曾用名Clawdbot、Moltbot)作为2026年最热门的开源个人AI助手平台,以“自然语言驱动自动化”为核心,支持对接飞书、Telegram等主流通讯工具,可替代人工完成文件操作、日历管理、邮件处理等重复性工作。其模块化架构适配多系统环境,既可以在Mac上本地化部署打造私人助手,也能通过阿里云实现7×24小时稳定运行,完美兼顾隐私性与便捷性。
6045 13
|
5天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
3761 7
|
3天前
|
人工智能 JavaScript 测试技术
保姆级教程:OpenClaw阿里云及本地部署+Claude Code集成,打造全能 AI 编程助手
在AI编程工具百花齐放的2026年,Anthropic推出的Claude Code凭借72.5%的SWE-bench测试高分、25倍于GitHub Copilot的上下文窗口,成为开发者追捧的智能编程助手。但单一工具仍有局限——Claude Code擅长代码生成与审查,却缺乏灵活的部署与自动化执行能力;而OpenClaw(前身为Clawdbot)作为开源AI代理框架,能完美弥补这一短板,通过云端与本地双部署,实现“代码开发-测试-部署”全流程自动化。
1792 13
|
1天前
|
人工智能 安全 前端开发
Team 版 OpenClaw:HiClaw 开源,5 分钟完成本地安装
HiClaw 基于 OpenClaw、Higress AI Gateway、Element IM 客户端+Tuwunel IM 服务器(均基于 Matrix 实时通信协议)、MinIO 共享文件系统打造。
|
10天前
|
人工智能 JSON JavaScript
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
手把手教你用 OpenClaw(v2026.2.22-2)+ 飞书,10分钟零代码搭建专属AI机器人!内置飞书插件,无需额外安装;支持Claude等主流模型,命令行一键配置。告别复杂开发,像聊同事一样自然对话。
6178 15
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人