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编程起步(第六课)
Jan 10 Javascript
jquery的index方法实现tab效果
Feb 16 Javascript
javascript学习笔记(十) js对象 继承
Jun 19 Javascript
javascript 手动给表增加数据的小例子
Jul 10 Javascript
防止jQuery ajax Load使用缓存的方法小结
Feb 22 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
Mar 02 Javascript
每天一篇javascript学习小结(RegExp对象)
Nov 17 Javascript
jQuery实现磁力图片跟随效果完整示例
Sep 16 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
Dec 04 Javascript
vue-cli中的babel配置文件.babelrc实例详解
Feb 22 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
vue中get请求如何传递数组参数的方法示例
Nov 08 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/04/02 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
详解Python装饰器由浅入深
2016/12/09 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
python requests post多层字典的方法
2018/12/27 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
python 伯努利分布详解
2020/02/25 Python
塔吉特百货公司官网:Target
2017/04/27 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
中专毕业生自荐信
2013/11/16 职场文书
心理健康教育制度
2014/01/27 职场文书
淘宝好评语句大全
2014/12/31 职场文书
节水倡议书
2015/01/19 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
Oracle表空间与权限的深入讲解
2021/11/17 Oracle