ES6中异步对象Promise用法详解


Posted in Javascript onJuly 31, 2019

本文实例讲述了ES6中异步对象Promise用法。分享给大家供大家参考,具体如下:

回忆一下ES5中的怎么使用异步方法

// es5中的异步回调
  let ajax = function(callback){
   console.log('执行')  // 执行
   setTimeout(() => {
    callback&&callback.call();
   }, 1000)
  };
  ajax(function(){
   console.log('hello') // 1s后打印hello
  });

使用ES6的Promise的方法:

let ajax = function(){
   console.log('执行2'); // 执行2
   return new Promise((resolve,reject)=>{
    setTimeout(() => {
     resolve() // 执行下一步操作, reject  // 中断当前的操作
    },5000)
   })
}
ajax().then(()=>{
   console.log('promise','timeout2')  // 5s后打印  promise timeout2
})

连续使用Promise对象:

let ajax = function(){
   console.log('执行3');
   return new Promise((resolve,reject)=>{
    setTimeout(() => {
     resolve();
    },5000)
   })
}
ajax().then(function(){
   return new Promise(function(resolve,reject){
    setTimeout(() => {
     resolve()
    }, 2000)
   })
}).then(function(){
   console.log('timeouk3') // 7s后打印timeouk3
})

Promise捕获错误的catch( )

// catch 捕获错误
let ajax = function(num){
   console.log('执行4');
   return new Promise(function(resolve,reject){
    if(num>=5){
     resolve();
    }else{
     throw new Error('传入的数字比5小')
    }
   })
}
ajax(4).then(function(){
   console.log('log',4);
}).catch(function(err){
   console.log('catch',err); // catch Error: 传入的数字比5小
})

Promise的两种高级用法

1.Promise.all( )

function loadImg(src){
   return new Promise((resolve,reject)=>{
    let img = document.createElement('img');
    img.src = src;
    img.onload = function(){
     resolve(img);
    }
    img.onerror = function(err){
     reject(err);
    }
   })
}
// 对所有的图片进行遍历
function showImgs(imgs){
   console.log(imgs);
   imgs.forEach(function(img){
    document.body.appendChild(img);
   })
}
// promise.all()的用法
Promise.all([
   loadImg('http://yanshi.sucaihuo.com/modals/0/23/small.jpg'),
   loadImg('http://yanshi.sucaihuo.com/modals/0/20/small.jpg'),
   loadImg('http://yanshi.sucaihuo.com/modals/0/2/small.jpg')
]).then(showImgs)
/**解析:
把多个promise实例当做一个promise实例,当所有的promise实例发生变化后
新的promise实例才会发生变化
*/

2.Promise.race( )

// Promise 先加载 有一个图片加载完就先添加到页面
  function loadImg(src){
   return new Promise((resolve,reject)=>{
    let img = document.createElement('img');
    img.src = src;
    img.onload = function(){
     resolve(img);
    }
    img.onerror = function(err){
     reject(err);
    }
   })
  }
  function showImgs(img){
   let p = document.createElement('p');
   p.appendChild(img);
   document.body.appendChild(p);
  }
  // promise.race()的用法 只要有一个网速好的加载完,其他的就不加载了
  Promise.race([
   loadImg('http://yanshi.sucaihuo.com/modals/0/23/small.jpg'),
   loadImg('http://yanshi.sucaihuo.com/modals/0/20/small.jpg'),
   loadImg('http://yanshi.sucaihuo.com/modals/0/2/small.jpg')
  ]).then(showImgs)
 }

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jquery实现点击TreeView文本父节点展开/折叠子节点
Jan 10 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
Jun 28 Javascript
js获取上传文件大小示例代码
Apr 10 Javascript
基于jQuery实现自动轮播旋转木马特效
Nov 02 Javascript
js判断复选框是否选中及选中个数的实现代码
May 30 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
Jun 14 Javascript
BootStrap table表格插件自适应固定表头(超好用)
Aug 24 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
Feb 09 Javascript
微信小程序实现天气预报功能
Jul 18 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
element中table高度自适应的实现
Oct 21 Javascript
vue 授权获取微信openId操作
Nov 13 Javascript
JS实现在线ps功能详解
Jul 31 #Javascript
ES6中定义类和对象的方法示例
Jul 31 #Javascript
Vue+Koa2 打包后进行线上部署的教程详解
Jul 31 #Javascript
简述vue-cli中chainWebpack的使用方法
Jul 30 #Javascript
vue实现中部导航栏布局功能
Jul 30 #Javascript
js定义类的方法示例【ES5与ES6】
Jul 30 #Javascript
Javascript 对象(object)合并操作实例分析
Jul 30 #Javascript
You might like
PHP中防止SQL注入实现代码
2011/02/19 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
Smarty模板配置实例简析
2019/07/20 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
极简的Python入门指引
2015/04/01 Python
在Python程序中实现分布式进程的教程
2015/04/28 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
Etam德国:内衣精品店
2019/08/25 全球购物
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
2014年培训工作总结范文
2014/11/27 职场文书
表彰大会新闻稿
2015/07/17 职场文书
结婚十年感言
2015/07/31 职场文书
生日祝酒词大全
2015/08/10 职场文书