ES6 Promise对象的应用实例分析


Posted in Javascript onJune 27, 2019

本文实例讲述了ES6 Promise对象的应用。分享给大家供大家参考,具体如下:

The Promise object represents the eventual completion (or failure) of an asynchronous operation, and its resulting value.

Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示。简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。

在promise之前处理异步回调的方式

function asyncFun(a,b,callback) {
   setTimeout(function () {
    callback(a+b);
   },200);
  }
  asyncFun(1,2, function (res) {
   if(res > 2) {
    asyncFun(res, 2, function (res) {
     if(res > 4) {
      asyncFun(res, 2, function (res) {
       console.log('ok');
       console.log(res);
      })
     }
    })
   }
  });

从上面可以看出所谓的”回调地狱”的可怕

使用promise来优雅的处理异步

function asyncFun(a,b) {
 return new Promise(function (resolve, reject) {
  setTimeout(function() {
   resolve(a + b);
  },200);
 })
}
asyncFun(1,2)
.then(function (res) {
 if(res > 2) {
  return asyncFun(res, 2);
 }
})
.then(function (res) {
 if(res > 4) {
  return asyncFun(res, 2);
 }
})
.then(function (res) {
 console.log('ok');
 console.log(res);
})
.catch(function (error) {
 console.log(error);
});

使用promise处理内部异常的举例

function asyncFun(a,b) {
 return new Promise(function (resolve, reject) {
  // 模拟异常判断
  if(typeof a !== 'number' || typeof b !== 'number') {
   reject(new Error('no number'));
  }
  setTimeout(function() {
   resolve(a + b);
  },200);
 })
}
asyncFun(1,2)
.then(function (res) {
 if(res > 2) {
  return asyncFun(res, 2);
 }
},function (err) {
 console.log('first err: ', err);
})
.then(function (res) {
 if(res > 4) {
  return asyncFun(res, 'a');
 }
},function (err) {
 console.log('second err: ', err);
})
.then(function (res) {
 console.log('ok');
 console.log(res);
},function (err) {
 console.log('third err: ', err);
});

从上面可以看出通过then的第二个回调函数处理promise对象中的异常,通过reject返回异常的promise对象

通过catch统一处理错误,通过finally执行最终必须执行的逻辑

function asyncFun(a,b) {
 return new Promise(function (resolve, reject) {
  // 模拟异常判断
  if(typeof a !== 'number' || typeof b !== 'number') {
   reject(new Error('no number'));
  }
  setTimeout(function() {
   resolve(a + b);
  },200);
 })
}
asyncFun(1,2)
.then(function (res) {
 if(res > 2) {
  return asyncFun(res, 2);
 }
})
.then(function (res) {
 if(res > 4) {
  return asyncFun(res, 'a');
 }
})
.then(function (res) {
 console.log('ok');
 console.log(res);
})
.catch(function (error) {
 console.log('catch: ', error);
})
.finally(function () {
 console.log('finally: ', 1+2);
});

通过Promise.all()静态方法来处理多个异步

function asyncFun(a,b) {
 return new Promise(function (resolve, reject) {
  setTimeout(function() {
   resolve(a + b);
  },200);
 })
}
var promise = Promise.all([asyncFun(1,2), asyncFun(2,3), asyncFun(3,4)])
promise.then(function (res) {
 console.log(res); // [3, 5, 7]
});

通过Promise.race()静态方法来获取多个异步中最快的一个

function asyncFun(a,b,time) {
 return new Promise(function (resolve, reject) {
  setTimeout(function() {
   resolve(a + b);
  },time);
 })
}
var promise = Promise.race([asyncFun(1,2,10), asyncFun(2,3,6), asyncFun(3,4,200)])
promise.then(function (res) {
 console.log(res); // 5
});

通过Promise.resolve() 静态方法来直接返回成功的异步对象

var p = Promise.resolve('hello');
p.then(function (res) {
 console.log(res); // hello
});

等同于,如下:

var p = new Promise(function (resolve, reject) {
 resolve('hello2');
})
p.then(function (res) {
 console.log(res); // hello2
});

通过Promise.reject() 静态方法来直接返回失败的异步对象

var p = Promise.reject('err')
p.then(null, function (res) {
 console.log(res); // err
});

等同于,如下:

var p = new Promise(function (resolve, reject) {
 reject('err2');
})
p.then(null, function (res) {
 console.log(res); // err
});

通过一个小例子来测试Promise在面向对象中应用

'use strict';
class User{
 constructor(name, password) {
  this.name = name;
  this.password = password;
 }
 send() {
  let name = this.name;
  return new Promise(function (resolve, reject) {
   setTimeout(function () {
    if(name === 'leo') {
     resolve('send success');
    }else{
     reject('send error');
    }
   });
  });
 }
 validatePwd() {
  let pwd = this.password;
  return new Promise(function (resolve, reject) {
   setTimeout(function () {
    if(pwd === '123') {
     resolve('validatePwd success');
    }else{
     reject('validatePwd error');
    }
   });
  })
 }
}
let user1 = new User('Joh');
user1.send()
 .then(function (res) {
  console.log(res);
 })
 .catch(function (err) {
  console.log(err);
 });
let user2 = new User('leo');
user2.send()
 .then(function (res) {
  console.log(res);
 })
 .catch(function (err) {
  console.log(err);
 });
let user3 = new User('leo', '123');
user3.validatePwd()
 .then(function (res) {
  return user3.validatePwd();
 })
 .then(function (res) {
  console.log(res);
 })
 .catch(function(error) {
  console.log(error);
 });
let user4 = new User('leo', '1234');
user4.validatePwd()
 .then(function (res) {
  return user4.validatePwd();
 })
 .then(function (res) {
  console.log(res);
 })
 .catch(function(error) {
  console.log(error);
 });

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jquery选择器之基本过滤选择器详解
Jan 27 Javascript
js限制checkbox选中个数以限制六个为例
Jul 15 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
Aug 24 Javascript
jQuery监听文件上传实现进度条效果的方法
Oct 16 Javascript
JS实现的简易拖放效果示例
Dec 29 Javascript
JavaScript数组迭代方法
Mar 03 Javascript
微信小程序 在线支付功能的实现
Mar 14 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
Apr 29 jQuery
socket.io学习教程之深入学习篇(三)
Apr 29 Javascript
bootstrap table服务端实现分页效果
Aug 10 Javascript
webpack4+react多页面架构的实现
Oct 25 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
Sep 01 Javascript
使用Vue 实现滑动验证码功能
Jun 27 #Javascript
js变量值传到php过程详解 将php解析成数据
Jun 26 #Javascript
javascript触发模拟鼠标点击事件
Jun 26 #Javascript
JavaScript动态添加数据到表单并提交的几种方式
Jun 26 #Javascript
react koa rematch 如何打造一套服务端渲染架子
Jun 26 #Javascript
通过javascript实现段落的收缩与展开
Jun 26 #Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
Jun 26 #Javascript
You might like
浅谈php和.net的区别
2014/09/28 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
用console.table()调试javascript
2014/09/04 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
vue项目中axios使用详解
2018/02/07 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
Python中的Matplotlib模块入门教程
2015/04/15 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
Python接口测试文件上传实例解析
2020/05/22 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
银行求职信范文
2014/05/26 职场文书
合理化建议书范文
2015/09/14 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP