Promise详解
创始人
2025-05-31 20:24:42
0
  • Promise就是一个用来存储数据的对象

  • 但是由于Promise存取方式的特殊,所以可以直接将异步调用的结果存储到Promise中

function sum(a, b) {return new Promise((resolve, reject) => {setTimeout(() => {resolve(a + b)}, 1000)})
}// 返回的是Promise,所以接收的时候不用变量接收,而是采用then获取Promise存储的数据
sum(123, 345).then(result => {console.log("结果为", result)
})

 调用方法就会有返回值,而调用then、catch、finally三种方法都会产生一个新的Promise

const promise = new Promise((resolve, reject) => {resolve("没问题的数据")
})const p2 = promise.then()console.log(p2)

 对Promise进行链式调用时,后面的方法(then和catch)读取的是上一步的执行结果

如果上一步的执行结果不是当前想要的结果,跳过当前的方法

const promise = new Promise((resolve, reject) => {reject("没问题的数据")
})// promise的链式调用
promise.then(r => console.log("第一个then", r)).catch(r =>  {console.log("异常处理", r)return "嘻嘻"}).then(r => console.log("第二个then", r))

打印结果为:

异常处理 没问题的数据第二个then 嘻嘻

上述示例中,reject绑定了异常的数据,下面的promise调用的第一个then方法显然不会接收reject绑定的那个的数据,即有问题的数据,所以第一个then被跳过,catch则专门用来接收有问题的数据和reject绑定的数据,所以进入和catch方法并打印 “没问题的数据" ,这个方法的结尾还有个return,这个return返回的 ”嘻嘻” 显然是个正常数据,执行完catch后返回了正常数据 “嘻嘻" 给新的promise,这个正确数据又被之后的 then方法捕捉到了,所以会把 ”嘻嘻" 接着打印出来;每次调用catch、finally、then都会产生一个新的promise

当Promise出现异常时,而整个调用链中没有catch,则异常则会向外抛出

所以一般都会在最后放catch方法,防止会有异常而没有相应的处理方法

静态方法

Promise的静态方法直接通过Promise类去调用,这些方法可以帮助我们完成一些更加复杂的异步操作

Promise.resolve()

创建一个立即完成的Promise

Promise.resolve(10)// 等价于new Promise((resolve, reject) => {resolve(10)
})

Promise.all

  • 需要有多个Promise需要执行,且需要多个Promise都执行完毕,再将结果进行统一处理,就使用Promise.all来处理
  • 语法: Promise.all(iterable)
  • Promise.all([...]) 同时但会多个Promise的执行结果,其中有一个报错,就返回错误信息
  • all需要一个数组(可迭代对象) 作为参数,数组种可以存放多个Promise
function sum(a, b) {return new Promise((reslove, reject) => {setTimeout(() => {reslove(a + b)}, 1000);})
}Promise.all([sum(1, 1), sum(2, 3), sum(3, 3)]).then((result) => {console.log(result)})

上面的例子中,调用三次sum,且将其添加到数组中传递给all,调用all会返回一个新的Promise,当三次计算都完成后,新的promise也会变成完成状态,并将三次执行的结果封装到数组中返回。\

// 添加的数据中一旦出现一个或者多个reject添加的错误信息, 整体的运行结果就会报错
Promise.all([sum(1, 1), sum(2, 3), sum(3, 3)], Promise.reject("哈哈")).then((result) => {console.log(result)})

注意:在all中添加数据,如果出现了一个或者多个通过reject添加的错误信息,运行结果就会报错,一个错,整个就错

Promise.allsSettled

  • Promise.allSettled( [...]) 同时返回多个Promise的运行结果,无论成功还是失败
  • 但是会根据不同得到状态返回不同的数据

成功:{status:”fulfilled”, value:result}

失败:{status:”rejected”, reason:error}

Promise.race

  • race会返回首先执行完的Promise,而忽略其他未执行完的Promise

Promise.Any

  • any和race类似,但是他只会返回第一个成功的Promise,如果所有的Promise都失败才会返回一个错误信息

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...