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 闭包深入理解(closure)
May 27 Javascript
JS两种定义方式的区别、内部原理
Nov 21 Javascript
Javascript学习笔记之数组的构造函数
Nov 23 Javascript
第七章之菜单按钮图标组件
Apr 25 Javascript
深入理解JS函数的参数(arguments)的使用
May 28 Javascript
微信小程序 网络API 上传、下载详解
Nov 09 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
Apr 27 jQuery
jQuery中clone()函数实现表单中增加和减少输入项
May 13 jQuery
JavaScript实现计数器基础方法
Oct 10 Javascript
Angular实现双向折叠列表组件的示例代码
Nov 21 Javascript
JS异步宏队列与微队列原理区别详解
Jul 02 Javascript
利用js实现简单开关灯代码
Nov 23 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
一个目录遍历函数
2006/10/09 PHP
PHP MSSQL 存储过程的方法
2008/12/24 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
php数组删除元素示例
2014/03/21 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
php显示时间常用方法小结
2015/06/05 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
Django如何使用redis作为缓存
2020/05/21 Python
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
槐乡的孩子教学反思
2014/04/27 职场文书
支部鉴定材料
2014/06/02 职场文书
销售竞赛活动方案
2014/08/23 职场文书
社区活动总结
2015/02/04 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
python代码实现备忘录案例讲解
2021/07/26 Python
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题