知识点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. TF的使用

      激活函数 关于激活函数的介绍请参考:激活函数 这里只是记录TF提供的激活函数 import tensorflow as tf a = tf.nn.relu( tf.matmul(x, w1) + ...

  2. CentOS7 下 Hadoop 分布式部署

    Hadoop 服务划分 使用三台节点,集群部署规划如下 服务\主机 hadoop1 hadoop2 hadoop3 HDFS NameNode DataNode DataNode SecondaryN ...

  3. jquery validate 详解一

    原文:http://blog.sina.com.cn/s/blog_608475eb0100h3h1.html jQuery校验官网地址:http://bassistance.de/jquery-pl ...

  4. Chrome DevTools: Export your raw Code Coverage Data

    The Code Coverage tool visually shows you which lines of code in your CSS and JavaScript are used an ...

  5. 转---redshift database ---学习

    摘自他人 前沿 根据最近一段时间对redshift的研究,发现一些特性比较适合我们当前的业务. 1 比如它的快速恢复能力,因为这一点,我们可以尽量在redshit里面存放一定生命周期的数据,对过期的数 ...

  6. java操作数据库:分页查询

    直接上.... 还是用之前的goods表,增加了一些数据 1.实体类Goods // 封装数据 public class Goods { private int gid; private String ...

  7. Android设置shape后改变颜色

    如下,可能多个btn的设置同一个shape,如果单独改变btn颜色,可以用如下代码 GradientDrawable btnPreDrawable = (GradientDrawable) btnTe ...

  8. JS判断是电脑浏览器还是手机端浏览器,并根据不同的终端跳转到不同的网址

    <!DOCTYPE html> <html> <script> function browserRedirect() { var sUserAgent = navi ...

  9. instanceof 操作符实现原理解析

    本文会介绍ES6规范中 instanceof 操作符的实现,以及自定义 instanceof 操作符行为的几个方法. 文中涉及的规范相关的代码皆为伪代码,为了便于理解,其中可能会省略一些参数判断逻辑或 ...

  10. SSH免费登录

    SSH免费登录很简单,如果有用过git的就更简单了 只需要一下两步操作就OK: 1.生成公钥和私钥,在linx上生成公钥和私钥,执行:ssh-keygen 2.执行ssh-copy-id +ip 例如 ...