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 相关文章推荐
一个不错的用JavaScript实现的UBB编码函数
Mar 09 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
Feb 03 Javascript
AngularJS入门教程(零):引导程序
Dec 06 Javascript
node.js操作mysql(增删改查)
Jul 24 Javascript
JSON对象 详解及实例代码
Oct 18 Javascript
Vue.JS入门教程之列表渲染
Dec 01 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
Jan 18 Javascript
AngularJS读取JSON及XML文件的方法示例
May 25 Javascript
JavaScript中使用参数个数实现重载功能
Sep 01 Javascript
vue如何判断dom的class
Apr 26 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
vue中用 async/await 来处理异步操作
Jul 18 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
cakephp打印sql语句的方法
2015/02/13 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
Javascript验证方法大全
2015/09/21 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
Python 专题三 字符串的基础知识
2017/03/19 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
如何利用Python写个坦克大战
2020/11/18 Python
python操作toml文件的示例代码
2020/11/27 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
亲戚结婚的请假条
2014/02/11 职场文书
总账会计岗位职责
2014/03/13 职场文书
电子工程求职信
2014/07/17 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
2016新年慰问信范文
2015/03/25 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS