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之间传值及子页面与父页面应用
Mar 11 Javascript
js遍历、动态的添加数据的小例子
Jun 22 Javascript
thinkphp中常用的系统常量和系统变量
Mar 05 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
控制台报错object is not a function的解决方法
Aug 24 Javascript
Egret引擎开发指南之发布项目
Sep 03 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
Javascript基础知识盲点总结之函数
May 15 Javascript
利用JQuery阻止事件冒泡
Dec 01 Javascript
利用jquery实现实时更新歌词的方法
Jan 06 Javascript
Vue入门之数据绑定(小结)
Jan 08 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
Feb 11 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中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP求最大子序列和的算法实现
2011/06/24 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
Array对象方法参考
2006/10/03 Javascript
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
Python实现批量下载文件
2015/05/17 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
python实现图片压缩代码实例
2019/08/12 Python
django和vue实现数据交互的方法
2019/08/21 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
python 字段拆分详解
2019/12/17 Python
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
技术经理的自我评价范文
2013/12/03 职场文书
幼儿园教师备课制度
2014/01/12 职场文书
仓库主管岗位职责
2014/03/02 职场文书
个人承诺书
2014/03/26 职场文书
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python