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实现拉伸拖动iframe的具体代码
Aug 03 Javascript
Jquery chosen动态设置值实例介绍
Aug 08 Javascript
iframe子父页面调用js函数示例
Nov 07 Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 Javascript
javascript折半查找详解
Jan 26 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
Mar 05 Javascript
jquery中表单 多选框的一种巧妙写法
Sep 06 Javascript
JS模态窗口返回值兼容问题的完美解决方法
May 28 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
Feb 23 Javascript
Vuex中的Mutations的具体使用方法
Jun 01 Javascript
jQuery开发仿QQ版音乐播放器
Jul 10 jQuery
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 中文处理函数集合
2008/08/27 PHP
php 的反射详解及示例代码
2016/08/25 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
学习ExtJS Panel常用方法
2009/10/07 Javascript
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
javascript 闭包疑问
2010/12/30 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
js实现动态时钟
2020/03/12 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
python 域名分析工具实现代码
2009/07/15 Python
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
Python中的默认参数详解
2015/06/24 Python
Python编程求质数实例代码
2018/01/31 Python
python实现文本界面网络聊天室
2018/12/12 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
python 如何引入协程和原理分析
2020/11/30 Python
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
家长会演讲稿范文
2014/01/10 职场文书
求职信的七个关键技巧
2014/02/05 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
临床医学专业求职信
2014/08/08 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
会议通知格式范文
2015/04/15 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python