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 相关文章推荐
JS实现鼠标单击与双击事件共存
Mar 08 Javascript
jQuery自带的一些常用方法总结
Sep 03 Javascript
javascript中的正则表达式使用指南
Mar 01 Javascript
JQuery实现鼠标移动图片显示描述层的方法
Jun 25 Javascript
jQuery入门之层次选择器实例简析
Dec 11 Javascript
js判断鼠标位置是否在某个div中的方法
Feb 26 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
Dec 26 Javascript
微信小程序侧边栏滑动特效(左右滑动)
Jan 23 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
Aug 28 Javascript
Es6 Generator函数详细解析
Feb 24 Javascript
JS实现滚动条触底加载更多
Sep 19 Javascript
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
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 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
php封装的验证码类分享
2017/02/26 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现读取文件最后n行的方法
2017/02/23 Python
python实现类之间的方法互相调用
2018/04/29 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python 动态调用函数实例解析
2019/10/21 Python
python基于property()函数定义属性
2020/01/22 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
大学生学业生涯规划
2014/01/05 职场文书
酒后驾驶检讨书
2014/01/27 职场文书
上班离岗检讨书
2014/09/10 职场文书
企业务虚会发言材料
2014/10/20 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
学生安全责任协议书
2016/03/22 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android