es6中Promise 对象基本功能与用法实例分析


Posted in Javascript onFebruary 23, 2020

本文实例讲述了es6中Promise 对象基本功能与用法。分享给大家供大家参考,具体如下:

Promise 是异步编程的一种解决方案,解决——回调函数和事件

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

下面代码创造了一个Promise实例。

基本用法

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

const promise = new Promise(function(resolve, reject) {
 //resolve (data)  成功
 //reject  (error )失败
});

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(function(value) {
 // success
}, function(error) {
 // err
});

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

下面是一个Promise对象的简单例子

function fun(ms){
 return new promise((res,rej) => {
 setTimeout(res,ms)
 })
}
fun(100).then((val) => {
 console.log(val)
})

promise还可以用来加载图片

function loadImageAsync(url) {
 return new Promise(function(resolve, reject) {
  const image = new Image();
  image.onload = function() {
   resolve(image);
  };
  image.onerror = function() {
   reject(new Error('Could not load image at ' + url));
  };
  image.src = url;
 });
}

上面代码中,使用Promise包装了一个图片加载的异步操作。如果加载成功,就调用resolve方法,否则就调用reject方法。

2,用Promise对象实现的 Ajax 操作的例子。

const getJSON = function(url) {
 const promise = new Promise(function(resolve, reject){
  const handler = function() {
   if (this.readyState !== 4) {
    return;
   }
   if (this.status === 200) {
    resolve(this.response);
   } else {
    reject(new Error(this.statusText));
   }
  };
  const client = new XMLHttpRequest();
  client.open("GET", url);
  client.onreadystatechange = handler;
  client.responseType = "json";
  client.setRequestHeader("Accept", "application/json");
  client.send();
 });
 return promise;
};
getJSON("/posts.json").then(function(json) {
 console.log('Contents: ' + json);
}, function(error) {
 console.error('出错了', error);
});

注意,调用resolve或reject并不会终结 Promise 的参数函数的执行。

Promise.prototype.finally()

finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

上面代码中,不管promise最后的状态,在执行完then或catch指定的回调函数以后,都会执行finally方法指定的回调函数,finally本质上是then方法的特例。

Promise.resolve()

//有时需要将现有对象转为 Promise 对象,Promise.resolve方法就起到这个作用。
const jsPromise = Promise.resolve($.ajax('/whatever.json'));

上面代码将 jQuery 生成的deferred对象,转为一个新的 Promise 对象。

Promise.resolve等价于下面的写法。

Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
//Promise.resolve方法的参数分成四种情况。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript操作DOM技巧总结》、《JavaScript页面元素操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》

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

Javascript 相关文章推荐
让IE6支持min-width和max-width的方法
Jun 25 Javascript
jquery一般方法介绍 入门参考
Jun 21 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
Apr 03 Javascript
js实现兼容IE和FF的上下层的移动
May 04 Javascript
js仿微博实现统计字符和本地存储功能
Dec 22 Javascript
JS实现间歇滚动的运动效果实例
Dec 22 Javascript
js生成随机数方法和实例
Jan 17 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
Aug 16 Javascript
微信小程序文章详情页面实现代码
Sep 10 Javascript
一篇文章了解正则表达式的替换技巧
Feb 24 Javascript
原生JavaScript之es6中Class的用法分析
Feb 23 #Javascript
原生javascript单例模式的应用实例分析
Feb 23 #Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
Feb 23 #Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 #Javascript
深入理解webpack process.env.NODE_ENV配置
Feb 23 #Javascript
微信小程序实现限制用户转发功能的实例代码
Feb 22 #Javascript
vue.js实现简单的计算器功能
Feb 22 #Javascript
You might like
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
Javascript 继承实现例子
2009/08/12 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
Django验证码的生成与使用示例
2017/05/20 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
PageFactory设计模式基于python实现
2020/04/14 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
业务代表的岗位职责
2013/11/16 职场文书
两年的个人工作自我评价
2014/01/10 职场文书
《菜园里》教学反思
2014/04/17 职场文书
交通安全标语
2014/06/06 职场文书
物业保洁员岗位职责
2015/02/13 职场文书