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 相关文章推荐
ext 列表页面关于多行查询的办法
Mar 25 Javascript
JavaScript控制Session操作方法
Jan 17 Javascript
Javascript实现的简单右键菜单类
Sep 23 Javascript
jQuery UI结合Ajax创建可定制的Web界面
Jun 22 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
Oct 24 Javascript
jquery easyui validatebox remote的使用详解
Nov 09 Javascript
jQuery插件zTree实现获取一级节点数据的方法
Mar 08 Javascript
javascript头像上传代码实例
Sep 28 Javascript
小程序使用分包的示例代码
Mar 23 Javascript
JavaScript原生数组函数实例汇总
Oct 14 Javascript
vue render函数动态加载img的src路径操作
Oct 26 Javascript
如何利用JavaScript编写一个格斗小游戏
Jan 06 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设计模式之迭代器模式的深入解析
2013/06/13 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
PHP实现验证码校验功能
2017/11/16 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
XmlUtils JS操作XML工具类
2009/10/01 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
python 正则表达式 概述及常用字符
2009/05/04 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
如何在django中实现分页功能
2020/04/22 Python
Python urllib2运行过程原理解析
2020/06/04 Python
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
如何选择使用结构还是类
2014/05/30 面试题
勤俭节约倡议书
2014/04/14 职场文书
平安校园建设方案
2014/05/02 职场文书
环境保护标语
2014/06/20 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
护士旷工检讨书
2015/08/15 职场文书