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 相关文章推荐
子窗口、父窗口和Silverlight之间的相互调用
Aug 16 Javascript
JQury slideToggle闪烁问题及解决办法
Jul 05 Javascript
Javascript排序算法之计数排序的实例
Apr 05 Javascript
jquery实现简单的轮换出现效果实例
Jul 23 Javascript
js识别uc浏览器的代码
Nov 06 Javascript
JS实现为排序好的字符串找出重复行的方法
Mar 02 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
24个解决实际问题的ES6代码片段(小结)
Feb 02 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
Feb 28 Javascript
javascript利用键盘控制小方块的移动
Apr 20 Javascript
vue cli4.0项目引入typescript的方法
Jul 17 Javascript
vue 手机物理监听键+退出提示代码
Sep 09 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高手?学会“懒惰”的编程
2006/12/05 PHP
PHP源码之explode使用说明
2011/08/05 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
PHP里的单例类写法实例
2015/06/25 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
2015/12/04 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
js实现中文实时时钟
2020/01/15 Javascript
十分钟教你上手ES2020新特性
2020/02/12 Javascript
vue 组件简介
2020/07/31 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
python开发之str.format()用法实例分析
2016/02/22 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
基于Django实现日志记录报错信息
2019/12/17 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
数学系毕业生的自我评价
2014/01/10 职场文书
高三高考决心书
2014/03/11 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP