Promise学习使用
2024-10-11 01:15:57
Promise是承诺的意思,“承诺可以获取异步操作的消息”,是一种异步执行的方案,Promise有各种开源实现,在ES6中被统一规范,由浏览器直接支持。
Promise 对象有三种状态:pending
、fullfilled
和 rejected
,分别代表了 promise 对象处于等待、执行成功和执行失败状态
示例:
参数resolve,reject都是函数,执行成功调用 resolve('成功'),操作状态变为fullfilled
, 否则执行 reject('失败:' + timeOut),操作状态变为rejected,转化过程只能有一次.
创建Promise对象执行test()函数。
function test(resolve, reject) {
var timeOut = Math.random() * 2;
setTimeout(function() {
if (timeOut < 1) {
resolve('成功');
} else {
reject('失败:' + timeOut);
}
}, timeOut * 1000);
} new Promise(test).then(res => {
console.log(res);
}).catch(res => {
console.log(res);
})
Promise串行执行任务:
如果有多个异步任务,先做任务1,成功之后再做任务2,这样会写多层嵌套代码,Promise可以更简单的使用:
job1.then(job2).then(job3).catch(handleError);
job1、then(job2)、then(job3)是一个Promise对象,job2、job3是函数方法
function multiply(input) {
return new Promise(function(resolve, reject) {
console.log('相加:' + input + '+' + input)
setTimeout(resolve, 500, input * input); //将input*input参数传给执行函数resolve
})
} function add(input) {
return new Promise(function(resolve, reject) {
console.log('相乘:' + input + '*' + input)
setTimeout(resolve, 500, input + input);
})
} var p = new Promise(function(resolve, reject) {
console.log('执行Promise')
resolve(5);
}) p.then(multiply)
.then(add)
.then(multiply)
.then(add)
.then(res => {
console.log('最终结果:' + res)
})
then方法相当于success方法,catch方法相当于fail方法
当两个任务不存在依赖关系的时候,可以并行请求,用Promise.all()实现
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
// 同时执行p1和p2,并在它们都完成后执行then:
Promise.all([p1, p2]).then(function (results) {
console.log(results); // 获得一个Array: ['P1', 'P2']
});
处理多个任务的时候,只需要获得先返回的结果即可,用Promise.race()实现
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
Promise.race([p1, p2]).then(function (result) {
console.log(result); // 'P1'
});
在一些任务没有回调函数或者不好控制完成时间的时候,我们可以用Promise来处理。
最新文章
- ucos实时操作系统学习笔记——任务间通信(消息)
- NFS 文件系统
- 将声音文件加入VC
- 继承extends
- java矩阵相乘的计算
- 【POJ 1260】Pearls
- 027. asp.net中数据绑定控件之 GridView控件
- css3 --- 翻页动画 --- javascript --- 3d --- 准备
- Delphi调用一个外部程序时,如何把外部程序的窗体放在主程序窗体的Panel上?
- 线性时间构造普吕弗(Pr&#252;fer)序列
- Oracle表管理
- DropDownList SelectedIndexChanged使用
- 清除浮动的方法 after伪类。
- window nfs 服务端配置安装
- 201521123079《java程序设计》第11周学习总结
- 关于Spring注解@Async引发其他注解失效
- ubuntu14.04 server ftp 服务安装配置详解
- 从零开始学习和改造activiti流程引擎的13天,自己记录一下
- 英语口语练习系列-C16-钱
- k8s的基本使用
热门文章
- react初探(二)之父子组件通信、封装公共组件
- vue中前端处理token过期的方法与axios请求拦截处理
- (转)如何在maven的pom.xml中添加本地jar包
- 雷林鹏分享:YAF路由问题
- 文献导读 | Single-Cell Sequencing of iPSC-Dopamine Neurons Reconstructs Disease Progression and Identifies HDAC4 as a Regulator of Parkinson Cell Phenotypes
- hdoj3251
- js用解构来定义变量并赋值
- vue部署的路径问题
- windows 下 修改jmeter ServerAgent端口
- 浅谈前端nuxt(ssr)