vue 同步 $nextTick setTimeout 执行的顺序

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>vue 同步 $nextTick setTimeout 执行的顺序</title>
</head>
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <div id="app">
    <button @click="clickMe" id="btn">{{msg}}</button>
    <div>
      事件循坏vent Loop中,每一次循环称为tick,每一次tick的任务如下:
      执行栈选择最先进入队列的宏任务(一般都是script),执行其同步代码直至结束;
      检查是否存在微任务,有则会执行至微任务队列为空;
      如有必要会渲染页面;
      开始下一轮tick,执行宏任务中的异步代码(setTimeout的回调等)。
      <br>
      宏任务与微任务
      宏任务(macrotask)
      宿主(Node、浏览器)发起的任务;
      在ES6规范中,将其称为task;
      script、setTimeout、setInterval、I/O、UI rendering、postMessage、MessageChannel、setImmediate
      微任务(microtask)
      JS引擎发起的任务;
      在ES6规范中,将其称为jobs;
      Promise、MutaionObserver、process.nextTick
    </div>
  </div>
  <script>
    var app = new Vue({
      el: ‘#app‘,
      data: {
        msg: ‘点击按钮判断控制台打印的内容‘
      },
      methods: {
        clickMe() {
          this.msg = ‘执行顺序 同步 => promise => setTimeout‘
          console.log(‘start‘)
          setTimeout(() => {
            console.log(‘timeout‘)
          }, 0)
          this.$nextTick(() => {
            console.log(‘nextTick‘)
            this.$nextTick(() => {console.log(‘nextTick2‘)})
            setTimeout(() => {
              console.log(‘timeout2‘)
            }, 0)
          })
          console.log(‘end‘)
        }
        // 先执行同步在执行异步 => 执行$nextTick返回promise,执行timeout (promise比timeout快)
        // 事件循环机制: 同步 => 微任务 => 渲染页面 => 开始下一轮,执行宏任务中的异步代码(setTimeout的回调等)
        // 为什么promise比timeout快 https://blog.csdn.net/weixin_34365635/article/details/91421326
        // 1. start
        // 2. end
        // 3. nextTick
        // 4. nextTick2
        // 5.nextTick2
        // 6.timeout
        // 7.timeout2

      }

    })
  </script>
</body>
</html>

原文地址:https://www.cnblogs.com/cengjingdeshuige/p/12568404.html

时间: 2024-10-10 09:47:44

vue 同步 $nextTick setTimeout 执行的顺序的相关文章

关于async/await、promise和setTimeout执行顺序

先来一道关于async/await.promise和setTimeout的执行顺序的题目: 1 async function async1() { 2 console.log('async1 start'); 3 await async2(); 4 console.log('asnyc1 end'); 5 } 6 async function async2() { 7 console.log('async2'); 8 } 9 console.log('script start'); 10 set

Javascript引擎单线程机制及setTimeout执行原理说明

setTimeout用法在实际项目中还是会时常遇到.比如浏览器会聪明的等到一个函数堆栈结束后才改变DOM,如果再这个函数堆栈中把页面背景先从白色设为红色,再设回白色,那么浏览器会认为DOM没有发生任何改变而忽略这两句话,因此我们可以通过setTimeout把“设回白色”函数加入下一个堆栈,那么就可以确保背景颜色发生过改变了(虽然速度很快可能无法被察觉). 总之,setTimeout增加了Javascript函数调用的灵活性,为函数执行顺序的调度提供极大便利. 然后,我们从基础的层面来看看:理解J

JavaScript执行优先顺序

js在html中的加载执行顺序 1.加载顺序:引入标记<script />的出现顺序, 页面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记<script />的出现顺序, <script />标记里面的或者通过src引入的外部JS,都是按照其语句出现的顺序执行,而且执行过程是文档装载的一部分. <script> alert("1-第一个执行"); </script&g

查询Oracle执行的顺序

explain plan for select CFG_ID, COUNT(0) total from LOG_FD_VIDEO_SAMPLE a where 1 = 1 and SERVICE_TYPE = 35 and FOUND_TIME >= to_date('2014-07-08 00:00:00', 'yyyy-MM-dd HH24:mi:ss') and FOUND_TIME <= to_date('2014-07-08 16:00:00', 'yyyy-MM-dd HH24:m

新手入门指导:Vue 2.0 的建议学习顺序

起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script>,把教程里的例子模仿一遍,理解用法.不推荐上来就直接用 vue-cli 构建项目,尤其是如果没有 Node/Webpack 基础. 3. 照着官网上的示例,自己想一些类似的例子,模仿着实现来练手,加深理解. 4. 阅读官方教程进阶篇的前半部分,到『自定义指令 (Custom Directive) 』为止.着

Java中的继承与静态static等的执行先后顺序

package extend; public class X { Y y=new Y(); static{  System.out.println("tttt"); } X(){  System.out.println("X"); }  public static void main(String[] args) {    new Z(); }} class Y{ Y(){  System.out.println("Y"); }} class Z

st-程序执行的顺序,session使用,a标签使用总结

9.11 cookie & session viewstate viewstate的值保存在浏览器的html代码中 , 当浏览器关闭 , 则值消失 , 即viewstate是在本页面之内各函数间进行传值的 , 至于为什么要使用这种方法 , 因为在一个事件发生之后 , 页面可能会 刷新 , 如果定义全局变量会被清零 , 所以要使用 viewstate.sessionSession采用键值对 , 也就是说ID存放客户端 , 而值放在服务器端 , 是通过用户的ID去找服务器上对应的值 , 这种方式值放

zerglurker007——代码执行的顺序

软件开发中,代码有三种基本执行顺序: 顺序执行 代码从入口开始一条一条执行,直到返回或者结束 循环执行 在设定条件后,代码重复执行某一个或多个部分,直到达到某些条件后终止 条件执行 代码会先判断某些条件,如果满足则执行部分代码,如果不满足则执行另一部分代码 实际当中,这三种执行顺序是交错出现的.你中有我,我中有你. 下面是上节课的代码,我们来一句一句的分析看,你就会明白我上面说的是什么了: #include <stdio.h> #include "public.h" int

Java 线程同步执行(顺序执行)

关于线程,有两种实现方法, 一种是通过继承Runnable接口,另外一种通过扩展Thread类,两者的具体差别,可参考我找的这篇文章 http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html .本主主要是讲 线程的同步执行问题.. 如果程序是通过扩展Thread类的,网上的资料说可以通过 join()函数实现,但本人亲测,此法无法通过.程序如下: public class test1 extends Thread { pu