promise,then,setTimeout -- 细致探讨执行流程

本文原理:

JavaScript是单线程,setTimeout会让代码置于线程末尾。

Promise建立后与正常代码一样顺序执行。

Promise在状态变为resolve后才会触发后续的then


  1. 读完本文大约需要15-25分钟
  2. 本文前置知识:基础js,Promise对象,ES6其他基础知识
  3. 阅读难度:初级
  4. 本文所有代码及输出结果都写了出来,可以不用编译器编译,直接浏览文章

如果你知道以下代码的执行结果,那么本文对你的收获就比较有限

const showNode = document.getElementById("show");

showNode.innerHTML += "normal | ";

let promise = new Promise((resolve, reject) => {
  showNode.innerHTML += "promise | ";
  setTimeout(() => { resolve("then |"); }, 0)
})

promise.then((res) => {
  setTimeout(() => { showNode.innerHTML += 'then wait | ' }, 0)
  showNode.innerHTML += res;
  return " next then | ";
}).then((res) => {
  showNode.innerHTML += res;
  return " next next then | ";
}).then((res) => {
  showNode.innerHTML += res;
})

setTimeout(() => { showNode.innerHTML += "wait | " }, 0)

// 输出: normal | promise | then | next then | next next then | wait | 
//       then wait |
复制代码




正文开始

Javascript 引擎单线程机制

  • 首先明确,JavaScript引擎是单线程机制

  • JavaScript 是单线程执行的,无法同时执行多段代码。当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个任务队列。一旦当前任务执行完毕,再从队列中取出下一个任务,这也常被称为 “阻塞式执行”。

  • 可以理解为:只有在 JS线程中没有任何同步代码要执行的前提下才会执行异步代码

有关js线程的知识可以移步 JS 单线程与 setTimeout 执行原理


promise,then,setTimeout的执行流程

正常顺序执行 -> then -> setTimeouts -> then中 setTimeouts


注1: showNode 是我用于获取html的元素,直接显示在页面上,替换console.log

注2: 事例代码中,新加的代码或有修改的代码,会在代码后面加上相应的注释


正常执行 :按照正常从上往下的顺序执行

环境1 普通代码在promise之前

showNode.innerHTML += "normal | ";

let promise = new Promise((resolve, reject) => {
  showNode.innerHTML +&#
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值