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.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
Jul 28 Javascript
jQuery中ajax的get()方法用法实例
Dec 26 Javascript
javascript中对变量类型的判断方法
Aug 09 Javascript
jQuery实现简单的列表式导航菜单效果代码
Aug 31 Javascript
jquery无限级联下拉菜单简单实例演示
Nov 23 Javascript
javascript基于原型链的继承及call和apply函数用法分析
Dec 15 Javascript
手机端js和html5刮刮卡效果
Sep 29 Javascript
探讨Vue.js的组件和模板
Oct 27 Javascript
vue+egg+jwt实现登录验证的示例代码
May 18 Javascript
Vue实现商品分类菜单数量提示功能
Jul 26 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
Mar 06 Javascript
基于element-ui封装表单金额输入框的方法示例
Jan 06 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 数学运算验证码实现代码
2009/10/11 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
php intval函数用法总结
2019/04/14 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
angularJS开发注意事项
2018/05/26 Javascript
js实现随机点名程序
2020/09/17 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
Python常用正则表达式符号浅析
2014/08/13 Python
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
python executemany的使用及注意事项
2017/03/13 Python
【python】matplotlib动态显示详解
2019/04/11 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
django中使用POST方法获取POST数据
2019/08/20 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
Django跨域请求原理及实现代码
2020/11/14 Python
团支书的期末学习总结自我评价
2013/11/01 职场文书
给孩子的新年寄语
2014/04/08 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
特此通知格式
2015/04/27 职场文书