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 setTimeout和setInterval 的区别
Dec 08 Javascript
jQuery的12招常用技巧分享
Aug 08 Javascript
深入理解JavaScript作用域和作用域链
Oct 21 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
Dec 11 Javascript
Jquery对select的增、删、改、查操作
Feb 06 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
Sep 14 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
Mar 30 Javascript
JavaScript的instanceof运算符学习教程
Jun 08 Javascript
网页挂马方式整理及详细介绍
Nov 03 Javascript
React-Router如何进行页面权限管理的方法
Dec 06 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
Aug 08 Javascript
vue3修改link标签默认icon无效问题详解
Oct 09 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
phpinfo 系统查看参数函数代码
2009/06/05 PHP
PHP之数组学习
2011/05/29 PHP
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
管理专员自荐信
2014/01/26 职场文书
教师产假请假条
2014/04/10 职场文书
2014年党建工作总结
2014/11/11 职场文书
追悼会答谢词
2015/01/05 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
六五普法心得体会2016
2016/01/21 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS