宏任务和微任务的执行顺序

JavaScript010

宏任务和微任务的执行顺序,第1张

运行下面例子分析:

打印顺序依次为:

script start

async2 end

Promise

script end

async1 end

promise1

promise2

setTimeout

JS 运行机制为从上而下,首先打印script start,async/await 是Promise包装执行会立即执行async2()打印async2 end,把setTimeout加入宏任务队列但是不会立马执行,往下走,Promise创建属于同步任务此时打印Promise,并放入宏任务队列中,再往下走直接打印script end,此时如果有微任务会优先执行微任务队列,微任务队列执行完毕再执行宏任务,async1 end 的打印是因为执行了Promise.then的方法,继续微任务输出promise1、promise2,当微任务队列为空,执行宏任务setTimeout,此时打印setTimeout。

说说事件循环(Event Loop)

一个 Event Loop 中,可以有一个或者多个任务队列(task queue),一个任务队列便是一系列有序任务(task)的集合;每个任务都有一个任务源(task source),源自同一个任务源的 task 必须放到同一个任务队列,从不同源来的则被添加到不同队列。setTimeout/Promise 等API便是任务源,而进入任务队列的是他们指定的具体执行任务。

在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,

关键步骤如下:

在此次 tick 中选择最先进入队列的任务(oldest task),如果有则执行(一次)

检查是否存在 Microtasks,如果存在则不停地执行,直至清空 Microtasks Queue

更新 render

主线程重复执行上述步骤

在上诉tick的基础上需要了解几点:

1、JS分为同步任务和异步任务

2、同步任务都在主线程上执行,形成一个执行栈

3、主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件。

4、一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行。

从给定的数据中,随机抽出一项,这项的左边放所有比它小的,右边放比它大的,然后再分别这两边执行上述操作,采用的是递归的思想,总结出来就是 实现一层,分别给两边递归,设置好出口

function fastSort(array,head,tail){

    //考虑到给每个分区操作的时候都是在原有的数组中进行操作的,所以这里head,tail来确定分片的位置

    /*生成随机项*/

    var randomnum = Math.floor(ranDom(head,tail))

    var random = array[randomnum]

    /*将小于random的项放置在其左边  策略就是通过一个临时的数组来储存分好区的结果,再到原数组中替换*/

    var arrayTemp = []

    var unshiftHead = 0

    for(var i = headi <= taili++){

      if(array[i]<random){

        arrayTemp.unshift(array[i])

        unshiftHead++

      }else if(array[i]>random){

        arrayTemp.push(array[i])

      }

      /*当它等于的时候放哪,这里我想选择放到队列的前面,也就是从unshift后的第一个位置放置*/

      if(array[i]===random){

        arrayTemp.splice(unshiftHead,0,array[i])

      }

    }

    /*将对应项覆盖原来的记录*/

    for(var j = head , u=0j <= tailj++,u++){

      array.splice(j,1,arrayTemp[u])

    }

    /*寻找中间项所在的index*/

    var nowIndex = array.indexOf(random)

    /*设置出口,当要放进去的片段只有2项的时候就可以收工了*/

    if(arrayTemp.length <= 2){

      return

    }

    /*递归,同时应用其左右两个区域*/

    fastSort(array,head,nowIndex)

    fastSort(array,nowIndex+1,tail)

  }

JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。

sort() 方法用于对数组的元素进行排序。语法如下:

arrayObject.sort(sortby)

例如:

function NumAscSort(a,b)

{

 return a - b

}

function NumDescSort(a,b)

{

 return b - a

}

var arr = new Array( 3600, 5010, 10100, 801) 

arr.sort(NumDescSort)

alert(arr)

arr.sort(NumAscSort)

alert(arr)