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图片自动切换效果处理代码
May 07 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
Nov 15 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
Oct 22 Javascript
学习JavaScript设计模式(单例模式)
Nov 26 Javascript
使用堆实现Top K算法(JS实现)
Dec 25 Javascript
轻松实现javascript图片轮播特效
Jan 13 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
Feb 25 Javascript
详解微信小程序——自定义圆形进度条
Dec 29 Javascript
微信小程序 二维码canvas绘制实例详解
Jan 06 Javascript
vue中子组件传递数据给父组件的讲解
Jan 27 Javascript
vue学习之Vue-Router用法实例分析
Jan 06 Javascript
vue打包时去掉所有的console.log
Apr 10 Vue.js
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应用程序来获取Web服务器的状态信息
2006/10/09 PHP
隐性调用php程序的方法
2009/03/09 PHP
str_replace只替换一次字符串的方法
2013/04/09 PHP
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
BootStrap selectpicker
2016/06/20 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
浅谈MySQL中的触发器
2015/05/05 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
详解python 注释、变量、类型
2018/08/10 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
护士求职推荐信范文
2013/11/23 职场文书
草船借箭教学反思
2014/02/03 职场文书
科学发展观标语
2014/10/08 职场文书
家长会欢迎词
2015/01/23 职场文书
volatile保证可见性及重排序方法
2022/08/05 Java/Android