关于多个Promise对象及then()函数的执行顺序的研究记录

今天终于想要研究一下多个 Promise 对象的执行顺序问题了,在研究完后记录一下。

我想研究的是以下问题:

1、多个 Promise 对象及其then函数的执行顺序,这里不研究处于不同状态的 Promise 对象的执行顺序

2、在 Promise 中的定时器延时问题(这个问题其实在 MDN 和阮一峰老师的 ES6 入门中都讲过,只是我光看文字有点晕,所以自己写代码来理解)

废话不多说,先上代码吧

// 延时执行
new Promise(resolve => setTimeout(() => {
    resolve()
}, 1000))
.then(() => console.log(‘我是延时执行的‘))
.catch(e => console.error(e))
// 在第二个then()函数运行时打印
new Promise(resolve => resolve()).then(() => ‘这是第三步打印的‘)
.then(value => console.log(value))
.catch(e => console.log(‘错误是:‘+e))
// 在第二个then()函数运行时打印,与上一个Promise不同的是令Promise变成fulfilled状态的方法不同
Promise.resolve().then(() => ‘这也是第三步打印的‘)
.then(value => console.log(value))
.catch(e => console.log(‘错误是:‘+e))
// 在第二个then()函数运行时打印
new Promise(resolve => resolve()).then(() => ‘这还是第三步打印的‘)
.then(value => console.log(value))
.catch(e => console.log(‘错误是:‘+e))
// 在第一个then()函数运行时打印
const p = value => {
    return new Promise(resolve => resolve(value))
}
p(‘这是第二步打印的‘).then(value => console.log(value))
// 在第一个then()函数运行时打印
new Promise(resolve => resolve()).then(() => console.log(‘这也是第二步打印的‘))
.catch(e => console.log(‘错误是:‘+e))
// 在Promise构造函数执行时打印
new Promise(() => console.log(‘这是第一步打印的‘))
.catch(e => console.error(e));
// 非异步打印
console.log(‘这不在Promise中‘);

代码的运行结果如下

那么,根据打印的结果,我理解的 Promise 的执行逻辑是:

1. 按同步的运行顺序,执行 Promise 的构造函数

2. 将所有 Promise 构造函数后的第一个 then() 函数放入异步队列中(如果存在的话)

3.1 将所有 Promise 构造函数后的第二个 then() 函数放入异步队列中(如果存在的话)

3.2 执行异步队列中的 then() 函数

注:3.1 与 3.2 是我搞不清楚具体的执行顺序,猜测的可能的执行方式,因为我觉得两种执行顺序的结果相同,所以就当作是两种分支看待好了,以下的 .1 与 .2 对应 3.1 与 3.2

4.1 将所有 Promise 构造函数后的第 X 个 then() 函数放入异步队列中,重复执行直到所有 then() 函数已放入异步队列中,执行异步队列中的 then() 函数

4.2 将所有 Promise 构造函数后的第X个 then() 函数放入异步队列中(如果存在的话),执行异步队列中的 then() 函数,重复该步骤直到所有 then() 函数均已执行完毕。

另外,当在 Promise 中使用定时器时,会在定时器结束后令后一个 then() 函数进入异步队列。

原文地址:https://www.cnblogs.com/FreezeNow/p/12403837.html

时间: 2024-10-07 19:49:16

关于多个Promise对象及then()函数的执行顺序的研究记录的相关文章

事件函数的执行顺序

 事件函数的执行顺序 在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数.此执行顺序说明如下: Editor Reset: Reset调用来初始化脚本的属性,当它第一次附加到该对象,并且使用Reset命令时. 第一次Scene Load scene启动 (一次为每个场景中的对象) 时,会调用这些函数. Awake:此函数始终是开始任何职能之前调用,并且也是在一个预置实例化之后.(如果一个游戏对象处于非活动状态,Awake不会被调用当被激活时 或者一个附加到游戏对象的任何脚本

jqMobile中pageinit,pagecreate,pageshow等函数的执行顺序

常见的共有5个page函数,刚开始有点迷糊的是到底谁先谁后执行. 实验告诉我们结果: var temp = ''; $('body').live('pagechange', function () { temp += 'pagechange,\n'; console.log (temp); }) $('body').live('pagecreate', function () { temp += 'pagecreate,\n'; console.log(temp); }) $('body').l

unity3D技术之事件函数的执行顺序[转]

unity3D技术之事件函数的执行顺序 转自http://www.yxkfw.com/?p=13703 在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数.此执行顺序说明如下: Editor Reset: Reset调用来初始化脚本的属性,当它第一次附加到该对象,并且使用Reset命令时. 第一次Scene Load scene启动 (一次为每个场景中的对象) 时,会调用这些函数. Awake:此函数始终是开始任何职能之前调用,并且也是在一个预置实例化之后.(如果一个游戏对象处

Unity3D中组件事件函数的执行顺序

事件函数的执行顺序 Unity 脚本中有许多按预设顺序以脚本身份运行的事件函数.其执行顺序如下: 加载第一个场景 启动场景时调用这些函数(为场景中的每个对象调用一次). Awake: 始终在调用任何 Start 函数之前和实例化预设之后调用此函数.(如果游戏对象 (GameObject) 在启动期间处于非活动状态,则直到其处于活动状态时或调用添加至其本身的任何脚本中的函数时,再调用 Awake 函数.) OnEnable: (仅当对象 (Object) 处于活动状态时调用此函数):程序会在启用该

Execution Order of Event Functions, unity 3d 事件函数的执行顺序

学习unity3d,感觉事件顺序很重要.就翻译一下官方文档吧. Execution Order of Event Functions 事件函数的执行顺序 In Unity scripting, there are a number of event functions that get executed in a predetermined order as a script executes. This execution order is described below: Unity 脚本中

vue父子组件钩子函数的执行顺序

加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted 更新过程 父beforeUpdate->子beforeUpdate->子updated->父updated 销毁过程 父beforeDestroy->子beforeDestroy->子destroyed->父destroye

解读setTimeout,promise.then,process.nextTick,setImmediate的执行顺序

最近在看<Node.js调试指南>的时候遇到有意思的几道题,是关于setTimeout, promise.then, process.nextTick, setImmediate的执行顺序.今天抽空记录下这道题的分析过程及背后的原理与知识点. 题目如下: // 题目一: setTimeout(()=>{ console.log('setTimeout') },0) setImmediate(()=>{ console.log('setImmediate') }) // 题目二: c

Tip8:Unity中诸如 Awake() Start() Update()等函数的 执行顺序

Unity脚本中有很多的事件函数,下面是各种函数的执行顺序: 1.reset(); 2.Awake(); 3.OnEnable; 4.OnLevelWasLoaded(); 5.Start(); 6.OnApplicationPause(); 7.FixedUpdate(); 8.Update(); 9.LateUpdate(); 10.Rendering(渲染)类 11.Coroutines(协调程序)类 12.OnDestroy(); 13.OnApplicationQuit(); 14.O

Drupal主题预处理函数与处理函数的执行顺序

Drupal的主题机制当中存在很多种预处理函数和处理函数,看起来让人犯晕.本文为大家总结了它们执行的基本规律. Drupal的所有预处理函数在处理函数之前运行. template前缀的函数首先运行,module前缀的函数其次运行,theme前缀的函数最后运行. Drupal的多钩子函数在特定钩子函数之前运行. 下面是总结的执行顺序列表,自上而下执行: template_preprocess() template_preprocess_HOOK() MODULE_preprocess() MODU