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实现点击链接弹出"图片另存为"而不是直接打开
Aug 15 Javascript
jquery 简短右键菜单 多浏览器兼容
Jan 01 Javascript
JavaScript 面向对象之命名空间
May 04 Javascript
javascript回车完美实现tab切换功能
Mar 13 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
AngularJS指令用法详解
Nov 02 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
原生JS上传大文件显示进度条 php上传文件代码
Mar 27 Javascript
详解vue+webpack+express中间件接口使用
Jul 17 Javascript
JavaScript箭头函数中的this详解
Jun 19 Javascript
Vue实现PC端靠边悬浮球的代码
May 09 Javascript
element中table高度自适应的实现
Oct 21 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
BBS(php & mysql)完整版(七)
2006/10/09 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
php面向对象重点知识分享
2019/09/27 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
js倒计时抢购实例
2015/12/20 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
Python模块文件结构代码详解
2018/02/03 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
HTML5标签大全
2016/11/23 HTML / CSS
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
汉语言文学毕业生求职信
2013/10/01 职场文书
领导干部保密承诺书
2014/08/30 职场文书
就业协议书
2014/09/12 职场文书
党员先进事迹材料
2014/12/19 职场文书
产品质量保证书范本
2015/02/27 职场文书
个性与发展自我评价
2015/03/06 职场文书
如何Python使用re模块实现okenizer
2022/04/30 Python