ES6学习笔记五(promise异步)
知识点1:rosolve是执行下一步then()
// Promise
{
let ajax=function(){
console.log('执行2');
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve()
},);
})
} ajax().then(function(){
console.log('promise','timeout2');
})
}
知识点2:允许多个下一步(then()里面再嵌Promise实例)
{
// 允许多个下一步
let ajax=function(){
console.log('执行3');
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve() //允许下一步then
},);
})
}
ajax()
.then(function(){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve();
},);
});
})
.then(function(){
console.log('timeout3');
})
}
知识点3:抛错时处理
{
// 抛错时处理
let ajax=function(num){
console.log('执行4');
return new Promise(function(resolve,reject){
if(num>){
resolve()
}else {
throw new Error('出错了')
}
})
}
ajax().then(function(){
console.log('log',);
}).catch(function(err){
console.log('catch',err);
});
ajax().then(function(){
console.log('log',);
}).catch(function(err){
console.log('catch',err);
});
}
应用场景:图片加载( Promise.all([]).then() 和 Promise.race([]).then() )
场景1:多张图片加载,实现所有图片加载完,再一起出现在页面上,提高用户体验
{
// 所有图片加载完再添加到页面
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){
imgs.forEach(function(img){
document.body.appendChild(img);
})
}
Promise.all([ //all是把多个Promise实例,只有所有合成一个Promise实例,只有所有Promise实例状态都发生变化时,才会生成新的Promise实例
loadImg('https://cdn.baigebao.com/upload/pc/20181016/5bc53a30b2291.png'),
loadImg('https://cdn.baigebao.com/upload/pc/20181008/5bbad45787a22.png'),
loadImg('https://cdn.baigebao.com/upload/pc/20181016/5bc53a30b2291.png')
]).then(showImgs);
}
场景2:有一个图片加载完成就添加到桌面
{
// 有一个图片加载完成就添加到桌面
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([ //只要有一个状态改变就先显示,只显示一张
loadImg('https://cdn.baigebao.com/upload/pc/20181016/5bc53a30b2291.png'),
loadImg('https://cdn.baigebao.com/upload/pc/20181008/5bbad45787a22.png'),
loadImg('https://cdn.baigebao.com/upload/pc/20181016/5bc53a30b2291.png')
]).then(showImgs);
}
注意:
promise中的resolved 总是晚于本轮循环中的同步任务
例子:
new Promise((resolve, reject) => {
resolve();
console.log();
}).then(r => {
console.log(r);
});
// 2
//
调用resolve(1)以后,后面的console.log(2)还是会执行,并且会首先打印出来。这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。
一般来说,调用resolve或reject以后,Promise 的使命就完成了,后继操作应该放到then方法里面,而不应该直接写在resolve或reject的后面。所以,最好在它们前面加上return语句,这样就不会有意外。
new Promise((resolve, reject) => {
return resolve();
// 后面的语句不会执行
console.log();
})
ES6学习笔记五(promise异步)的更多相关文章
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记五:Promise异步任务
一:Promise对象 Promise对象代表一个异步操作,有三种状态:Pending(进行中).Resolved(已完成,又称 Fulfilled)和Rejected(已失败). 二:创建与使用 v ...
- ES6学习笔记之Promise
入职百度EFE团队实习已经三周了,实习中接触到了生产环境的技术和开发流程,大开眼界,和自己在学校接小作坊式项目是很不一样的体验.其中一个很大的感触是,ES6早已不是“选修”的尝鲜技术,而是已经全面普及 ...
- STM32学习笔记(五) USART异步串行口输入输出(轮询模式)
学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
随机推荐
- MapReduce-WordCount
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- rocketmq在linux搭建双master遇到的坑
我的环境 两台阿里云centos7服务器 首先,去官网下载解压包,解压. 然后进入bin目录,需要修改runserver.sh文件和runbroker.sh文件.因为rocketmq默认配置文件需要的 ...
- Hive记录-Impala jdbc连接hive和kudu参考
1.配置环境Eclipse和JDK 2.加载hive jar包或者impala jar包 备注:从CDH集群里面拷贝出来 下载地址:https://www.cloudera.com/downloads ...
- 057、macvlan 网络隔离和连通(2019-03-26 周二)
参考https://www.cnblogs.com/CloudMan6/p/7400580.html 在上一节中,两个host上四个容器的网络信息如下,然后进行网络连通性测试,可见通vlan的容器 ...
- redis整合Spring集群搭建及业务中的使用
1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...
- 二叉搜索树BST
//遍历 void print(int p){ if(!p) return; print(left[p]); printf("%d\n",a[p]); print(right[p] ...
- Nmap扫描基础常用命令(包含进阶使用)
Nmap扫描常用命令 - Nmap scans common commands 1.扫描单个目标 nmap ip 如:nmap 192.168.0.101 2.扫描多个目标 nmap ip1 ip2 ...
- CSS面试复习(二):CSS的使用
一.CSS基础 1.选择器 选择器{ 属性:值: 属性:值 } 作用:用于匹配HTML元素.分类和权重.解析方式和性能.值得关注的选择器 分类: 元素选择器a{} 伪元素选择器::before{} 类 ...
- 集成JUnit测试错误java.lang.IllegalStateException: Failed to load ApplicationContext
1 详细错误信息 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.t ...
- VUX调用例子
首先创建一个vue项目 vue init webpack Vue-Project <1>. 在项目里安装vuxnpm install vux --save <2>. 安 ...