Promise.then方法的执行顺序例题分析
1. 当Promise对象作为resolve的参数时
const p = Promise.resolve();
const p1 = Promise.resolve(p); //就是p
const p2 = new Promise(res => res(p)); //新建一个对象,对象状态依赖p
// res(p)可以看作 await p1; await resolve();
// 或者p.then(data => getData()).then(() => p2.resolve()) // 首先;p1 === p; p2!===p
// 那么,p1是一个fulfilled状态的对象;p2状态需要运行后求得
console.log(p === p1); // true
console.log(p === p2); // false p1.then(() => {
console.log('p1-1');
}).then(() => {
console.log('p1-2');
}).then(() => {
console.log('p1-3');
})
p2.then(() => { //p2.resolve之后才能调用回调函数
console.log('p2-1');
}).then(() => {
console.log('p2-2');
}).then(() => {
console.log('p2-3');
})
p.then(() => {
console.log('p-1');
}).then(() => {
console.log('p-2');
}).then(() => {
console.log('p-3');
})
// 运行结果
// getData()
p1-1
p-1
// resolve()
p1-2
p-2
p2-1
p1-3
p-3
p2-2
p2-3
2. 当Promise的resolve方法在另一个Promise对象的then方法中运行时,变异步;
let p3;
p1 = new Promise(resolve => {
p3 = new Promise(res => res());
p3.then(() => {
console.log('p3')
resolve(); // resolve()方法用在then方法中,变为异步执行
})
})
p1.then(() => {
console.log('p1-1');
}).then(() => {
console.log('p1-2');
})
p3.then(() => {
console.log('p3-1')
}).then(() => {
console.log('p3-2')
})
// 运行结果如下:
p3
p3-1
p1-1
p3-2
p1-2
示例:
const p1 = Promise.resolve();
let p3;
const p2 = new Promise(function(resolve, reject){
p3 = new Promise(res => res(p1));
p3.then(() => { //1 p3.then第一个
console.log('p3')
resolve('ok');
})
});
p1.then(() => {
console.log('p1-1')
}).then(() => {
console.log('p1-2')
}).then(() => {
console.log('p1-3')
})
p2.then(function(data) {
console.log('p2-1')
}).then(function(data) {
console.log('p2-2')
}).then(function(data) {
console.log('p2-3')
})
// p3.then第二个,p3状态变化触发then方法时,同时触发,按照先后顺序执行
// 只要时p3.then(...)都同时触发
p3.then(function(data) {
console.log('p3-1')
}).then(function(data) {
console.log('p3-2')
}).then(function(data) {
console.log('p3-3')
})
// 运行结果
p1-1
p1-2
p3
p3-1
p1-3
p2-1
p3-2
p2-2
p3-3
p2-3
3. 当使用catch()方法捕获异常时
const p1 = Promise.resolve();
const p2 = Promise.reject(); //状态为rejected
p1.then(() => {
console.log('p1-1')
}).then(() => {
console.log('p1-2')
}).then(() => {
console.log('p1-3')
})
p2.then(function(data) { //会立即触发,但是触发的是then中省略的第二个函数;
console.log('p2-1')
}).then(function(data) {
console.log('p2-2')
}).then(function(data) {
console.log('p2-3')
}).catch(() => {
console.log('catched')
})
// 运行结果如下:
p1-1
// 默认运行p2的第一个错误回调
p1-2
// 默认运行p2的第二个错误回调
p1-3
// 默认运行p2的第三个错误回调
catched
4. 当有async函数时
async function async1() {
console.log('async1 start');
await async2(); //async()函数执行是同步调用;生成Promise后等待状态改变返回结果是then任务
console.log('async1 end');
}
async function async2() {
console.log('async2');
}
console.log('script start');
setTimeout(() => {
console.log('setTimeout')
})
async1();
new Promise((resolve, reject) => {
console.log('promise1');
resolve();
}).then(() => {
console.log('promise2');
})
// 运行结果如下
script start
async1 start
async2
promise1
async1 end
promise2
setTimeout
Promise.then方法的执行顺序例题分析的更多相关文章
- 在Spring Bean的生命周期中各方法的执行顺序
Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下十种: 通过实现 InitializingBe ...
- C#类中方法的执行顺序
有些中级开发小伙伴还是搞不太明白在继承父类以及不同场景实例化的情况下,父类和子类的各种方法的执行顺序到底是什么,下面通过场景的举例来重新认识下方法的执行顺序: (下面内容涉及到了C#中的继承,构造函数 ...
- odoo开发笔记 -- 多个子类继承同一个父类方法的执行顺序
场景描述: odoo模块化开发的架构理念,科学&高效, 可以让很多业务场景,尽可能松耦合:让开发人员的主要精力,关注在当前的业务逻辑: 所谓「前人栽树,后人乘凉」,模块整体好比一棵大树, 开发 ...
- promise.then, setTimeout,await执行顺序问题
promise.then VS setTimeout 在chrome和node环境环境中均输出2, 3, 1, 先输出2没什么好说的,3和1顺序让人有些意外 原因: 有一个事件循环,但是任务队列可以有 ...
- jquery和js的几种页面加载函数的方法以及执行顺序
参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html https://www.cnblogs.com/james641/p/783837 ...
- process.nextTick,Promise.then,setTimeout,setImmediate执行顺序
1. 同步代码执行顺序优先级高于异步代码执行顺序优先级: 2. new Promise(fn)中的fn是同步执行: 3. process.nextTick()>Promise.then()> ...
- setTimeout,promise,promise.then, async,await执行顺序问题
今天下午看了好多关于这些执行顺序的问题 经过自己的实践 终于理解了 记录一下就拿网上出现频繁的代码来说: async function async1() { console.log('async1 ...
- JS中For循环中嵌套setTimeout()方法的执行顺序
在For循环中执行setTimeOut()方法的代码,执行顺序是怎样的呢? 代码如下 function time() { for(var i= 0;i<5;i++){ setTimeout(fu ...
- js中页面加载完成后执行的几种方法及执行顺序
在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$ ...
随机推荐
- C++ 重载运算符返回值 和 返回引用的原因
原因是: +,-,*等返回不了引用,比如+运算符,可以如下重载(为了简单,假设A 只有int x:int y) A operator+(A a,A b) {A sum; sum.x=a.x+b.x ...
- 搭建hexo静态博客
使用hexo搭建博客,并将博客部署到github 需要的工具 Node.js Git 一个Github账号 正式开始 在任意目录下新建一个文件夹,如blog,在该文件夹下右键打开git bash he ...
- Win32小游戏--贪吃蛇
近日里学习了关于win32编程的相关知识,利用这些知识制作了一款贪吃蛇小游戏,具体细节还是分模块来叙述 前期准备:在网上找到一些贪吃蛇的游戏素材图片,以及具体的逻辑框图 在正式写功能之前,先把一系列环 ...
- 数据库去空格 去table 去回车符号 去重
1 update bd_prod_cate c set c.cate_name = replace(c.cate_name,chr(9),'')//去掉tab符号的 2 update bd_prod_ ...
- 手动编译ts的经过
动机 以前写ts或者es6,都是用在脚手架搭建的项目中,比如vue和react,当时当我识图写一个ts的demo的,我还要创建一个完整的vue或者react项目?明显不合适,那就要研究一下如何手动搭建 ...
- Linux磁盘管理系列 — 磁盘配额管理
一.磁盘管理的概念 Linux系统是多用户任务操作系统,在使用系统时,会出现多用户共同使用一个磁盘的情况,如果其中少数几个用户占用了大量的磁盘空间,势必压缩其他用户的磁盘的空间和使用权限.因此,系统管 ...
- 怎样检测浏览器是否安装了某个插件, 比如flash
首先, 我们可以获取浏览器安装的所有在插件: navigator.plugins 它会返回一个类似数组的对象, 包含所有已安装插件的具体信息. navigator.plugins; 然后我们可以通过正 ...
- C#从零单排上王者系列---数据类型
从零单排系列简介 突然发现自己的基础不是很牢固,就买了一个<C#7.0的本质论>.本系列博客就是以此书为本,记录自己的学习心得,如果你的基础也不牢固,不如跟上博主一起学习成长呀! 本篇博客 ...
- ajax中的事件
blur : 当光标移开时(点击)触发 change : 当光标移开并且文本框中的内容和上一次不一致时(点击)触发
- jq的ajax方法
相较与js异步对象的繁琐,jq的ajax对象结构更加清晰 一:ajax对象简述 ajax(Asynchronous JavaScript and XML),异步的xml和js对象,主要用于在不刷新全局 ...