Promise是承诺的意思,“承诺可以获取异步操作的消息”,是一种异步执行的方案,Promise有各种开源实现,在ES6中被统一规范,由浏览器直接支持。

Promise 对象有三种状态:pendingfullfilled 和 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来处理。

  

最新文章

  1. ucos实时操作系统学习笔记——任务间通信(消息)
  2. NFS 文件系统
  3. 将声音文件加入VC
  4. 继承extends
  5. java矩阵相乘的计算
  6. 【POJ 1260】Pearls
  7. 027. asp.net中数据绑定控件之 GridView控件
  8. css3 --- 翻页动画 --- javascript --- 3d --- 准备
  9. Delphi调用一个外部程序时,如何把外部程序的窗体放在主程序窗体的Panel上?
  10. 线性时间构造普吕弗(Pr&#252;fer)序列
  11. Oracle表管理
  12. DropDownList SelectedIndexChanged使用
  13. 清除浮动的方法 after伪类。
  14. window nfs 服务端配置安装
  15. 201521123079《java程序设计》第11周学习总结
  16. 关于Spring注解@Async引发其他注解失效
  17. ubuntu14.04 server ftp 服务安装配置详解
  18. 从零开始学习和改造activiti流程引擎的13天,自己记录一下
  19. 英语口语练习系列-C16-钱
  20. k8s的基本使用

热门文章

  1. react初探(二)之父子组件通信、封装公共组件
  2. vue中前端处理token过期的方法与axios请求拦截处理
  3. (转)如何在maven的pom.xml中添加本地jar包
  4. 雷林鹏分享:YAF路由问题
  5. 文献导读 | Single-Cell Sequencing of iPSC-Dopamine Neurons Reconstructs Disease Progression and Identifies HDAC4 as a Regulator of Parkinson Cell Phenotypes
  6. hdoj3251
  7. js用解构来定义变量并赋值
  8. vue部署的路径问题
  9. windows 下 修改jmeter ServerAgent端口
  10. 浅谈前端nuxt(ssr)