js 中的睡眠函数

JavaScript027

js 中的睡眠函数,第1张

let array = [[{'level':"赛程表1",'time':3000},{'level':"对阵图1",'time':8000},{'level':"小组积分赛1",'time':10000}],[{'level':"赛程表2",'time':5000},{'level':"对阵图2",'time':8000},{'level':"小组积分赛2",'time':10000}],[{'level':"赛程表3",'time':5000},{'level':"对阵图3",'time':6000},{'level':"小组积分赛3",'time':9000}]]

async function sleep(time) {

  await new Promise((resolve,reject)=>{

     setTimeout(() => {

      //  console.log(`等了${time}s`)

       resolve()

     }, time)

  })

}

async function doSome(params) {

  for (let x = 0 x < array.length x++) {

    const eleArr = array[x]

    for (let y = 0 y < eleArr.length y++) {

      const ele = eleArr[y]

      console.log(ele.level)

      await sleep(ele.time)

      if (x>=array.length-1 && y>=eleArr.length-1) {

        doSome()

      }

    }

  }

}

doSome()

在js中,是没有睡眠这个概率的。

因为js语句是自上而下执行的,这样语句一触发,就会接着往小执行其他的代码,不会等着语句执行完毕。

所有,你这里需要的这个"睡眠",就算存在,那也只是延迟了for循环里面的代码的"执行",并不会延迟for本身的执行,我这里说的"延迟了for循环里面的代码的执行",是for循环内部的语句,一次性执行for所循环的次数次(这里可能有点难明白,比如for执行10次,延迟3秒,那for里面的代码会在延迟3秒后,一次性执行10次)。

如果要达到这个要求,就需要模拟"睡眠",使用定时器(setInterval)或者延时器(setTimeout):

//lst:需要循环的集合,timer:需要延迟的时间(单位:S)

function for_Interva(lst,timer){

    var index=0

    var Intertimer=setInterval(function(){

        //操作集合中第lst[index]个

        //集合小标+1

        index+=1

        //判断index是否达到集合最后一个

        if(index>=lst.length){

        //如果达到了,就清除定时器,停止循环

          clearInterval(Intertimer)

        }

    },timer)

}

function for_ITimeout(lst,timer){

       var index=0

       function timeoutfor(){

           //操作集合中第lst[index]个

            //集合小标+1

            index+=1

            //判断index是否达到集合最后一个

            if(index<lst.length){

            //没有达标,就继续循环。达标后,不会进入此if

                Timeout(function(){

                    timeoutfor()

                },timer)

            }

       }

    Timeout(function(){

            timeoutfor()

    },timer)

}

不行,setTimeout和setinterval的运行机制不是那样的,它是在指定时间之后运行,但循环会在此期间继续运行。js实现在循环中睡眠的功能几乎是不可能的。你既然用循环,那么可以用setInterval或者setTimeout递归