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 加载并解析XML字符串的代码
Dec 13 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
Apr 07 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
Jan 20 Javascript
Nginx上传文件全部缓存解决方案
Aug 17 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
Aug 30 Javascript
sso跨域写cookie的一段js脚本(推荐)
May 25 Javascript
Highcharts入门之简介
Aug 02 Javascript
jQuery插件版本冲突的处理方法分析
Jan 16 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
Feb 24 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
Jun 13 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
Sep 06 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
Apr 26 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
js 获取、清空input type="file"的值示例代码
2014/02/19 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
python中怎么表示空值
2020/06/19 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
机械设计制造专业个人求职信
2013/09/25 职场文书
法院实习人员自我鉴定
2013/09/26 职场文书
大四自我鉴定范文
2013/10/06 职场文书
大学生个人求职信例文
2014/07/07 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
redis数据一致性的实现示例
2022/03/18 Redis