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 相关文章推荐
javascript之typeof、instanceof操作符使用探讨
May 19 Javascript
JS中判断JSON数据是否存在某字段的方法
Mar 07 Javascript
jquery.validate.js插件使用经验记录
Jul 02 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
JSONP之我见
Mar 24 Javascript
JavaScript提高性能知识点汇总
Jan 15 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
May 12 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
Jun 02 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
Vue表单及表单绑定方法
Sep 04 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
Sep 06 Javascript
Vue.js的模板语法详解
Feb 16 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程序--记数器
2006/10/09 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
Python实现Linux下守护进程的编写方法
2014/08/22 Python
给Python初学者的一些编程技巧
2015/04/03 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
Django日志模块logging的配置详解
2017/02/14 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
快速了解Python相对导入
2018/01/12 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
对Python3 序列解包详解
2019/02/16 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
基于opencv实现简单画板功能
2020/08/02 Python
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
行政文员岗位职责
2013/11/08 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
关于 Python json中load和loads区别
2021/11/07 Python