知识点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. linux下安装SlickEdit

    title: linux下安装SlickEdit tags: 软件 date: 2018-10-08 21:32:12 --- linux下安装SlickEdit 下载安装包和补丁文件 补丁文件 官方 ...

  2. HDFS-Shell 文件操作

    一.操作 HDFS 上的文件有两个命令可以用 hdfs dfs:只能操作 HDFS 上的文件 Usage: hdfs [--config confdir] [--loglevel loglevel] ...

  3. python第二次周末大作业

    题目 ''' HR人力资源管理. 1. 菜单: ("查看员⼯信息","添加员⼯信息", "修改员⼯信息", "删除员⼯信息&quo ...

  4. Hadoop记录-变更

    1.安装salt-minion sed -i 's/^#//g' /etc/yum.repos.d/centos7.4.repo sed -i 's/enabled=0/enabled=1/g' /e ...

  5. 基于Asp.net C#实现HTML转图片(网页快照)

    一.实现方法 //WebSiteThumbnail.cs文件,在BS项目中需要添加对System.Windows.Forms的引用 using System; using System.Data; u ...

  6. Shell编程(八)每隔N分钟执行某脚本

    sudo crontab -e

  7. python web 开发

    第一个 简单的 WSGI demo from wsgiref.simple_server import make_server def application(environ, start_respo ...

  8. vue-cli3 第三版安装搭建项目

    Vue CLI是一个用于快速Vue.js开发的完整系统 3.X较2.X结构变了很多,更优雅,开发体验更好 官方:https://cli.vuejs.org/guide/ 安装:https://cli. ...

  9. ASP.NET Web API 2 之 HttpRequestMessage 对象

    Ø  前言 在 Web API 中经常会使用到 HttpRequestMessage 和 HttpResponseMessage 对象,这两个对象封装了对 Web API 的请求和响应,位于 Syst ...

  10. JS创建对象之原型模式

    一.原型对象 只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象:在默认情况下,所有原型对象都会 自动获得一个constructor(构造函 ...