知识点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异步)的更多相关文章

  1. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  2. ES6学习笔记五:Promise异步任务

    一:Promise对象 Promise对象代表一个异步操作,有三种状态:Pending(进行中).Resolved(已完成,又称 Fulfilled)和Rejected(已失败). 二:创建与使用 v ...

  3. ES6学习笔记之Promise

    入职百度EFE团队实习已经三周了,实习中接触到了生产环境的技术和开发流程,大开眼界,和自己在学校接小作坊式项目是很不一样的体验.其中一个很大的感触是,ES6早已不是“选修”的尝鲜技术,而是已经全面普及 ...

  4. STM32学习笔记(五) USART异步串行口输入输出(轮询模式)

    学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...

  5. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  6. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  7. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  8. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  9. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

随机推荐

  1. MapReduce-WordCount

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  2. rocketmq在linux搭建双master遇到的坑

    我的环境 两台阿里云centos7服务器 首先,去官网下载解压包,解压. 然后进入bin目录,需要修改runserver.sh文件和runbroker.sh文件.因为rocketmq默认配置文件需要的 ...

  3. Hive记录-Impala jdbc连接hive和kudu参考

    1.配置环境Eclipse和JDK 2.加载hive jar包或者impala jar包 备注:从CDH集群里面拷贝出来 下载地址:https://www.cloudera.com/downloads ...

  4. 057、macvlan 网络隔离和连通(2019-03-26 周二)

    参考https://www.cnblogs.com/CloudMan6/p/7400580.html   在上一节中,两个host上四个容器的网络信息如下,然后进行网络连通性测试,可见通vlan的容器 ...

  5. redis整合Spring集群搭建及业务中的使用

    1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...

  6. 二叉搜索树BST

    //遍历 void print(int p){ if(!p) return; print(left[p]); printf("%d\n",a[p]); print(right[p] ...

  7. Nmap扫描基础常用命令(包含进阶使用)

    Nmap扫描常用命令  - Nmap scans common commands 1.扫描单个目标 nmap ip 如:nmap 192.168.0.101 2.扫描多个目标 nmap ip1 ip2 ...

  8. CSS面试复习(二):CSS的使用

    一.CSS基础 1.选择器 选择器{ 属性:值: 属性:值 } 作用:用于匹配HTML元素.分类和权重.解析方式和性能.值得关注的选择器 分类: 元素选择器a{} 伪元素选择器::before{} 类 ...

  9. 集成JUnit测试错误java.lang.IllegalStateException: Failed to load ApplicationContext

    1 详细错误信息 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.t ...

  10. VUX调用例子

    首先创建一个vue项目 vue init webpack Vue-Project   <1>. 在项目里安装vuxnpm install vux --save   <2>. 安 ...