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 相关文章推荐
动态添加删除表格行的js实现代码
Feb 28 Javascript
node.js中的path.extname方法使用说明
Dec 09 Javascript
关于原生js中bind函数的简单实现
Aug 10 Javascript
微信小程序 wx:for的使用实例详解
Apr 27 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
Aug 10 Javascript
微信小程序 swiper组件构建轮播图的实例
Sep 20 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
Apr 21 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
Jun 10 jQuery
JavaScript 作用域scope简单汇总
Oct 23 Javascript
浅谈vue中组件绑定事件时是否加.native
Nov 09 Javascript
React.js组件实现拖拽排序组件功能过程解析
Apr 27 Javascript
PHP读取远程txt文档到数组并实现遍历
Aug 25 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备份数据库类分享
2015/04/14 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
简单谈谈JavaScript的同步与异步
2015/12/31 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
2018/05/23 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
Python中动态创建类实例的方法
2017/03/24 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
python实现二分查找算法
2020/09/18 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
allbeauty美国:英国在线美容店
2019/03/11 全球购物
父亲的菜园教学反思
2014/02/13 职场文书
幼儿园教学随笔感言
2014/02/23 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
《散步》教学反思
2014/03/02 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
Python操作CSV格式文件的方法大全
2021/07/15 Python