javascript阻塞问题


本文摘自PHP中文网,作者hzc,侵删。

javascript 阻塞程序运行

javascript的线程问题


JavaScript 是单线程的,一段 Js 程序的运行会占满整个程序进程,我们通常会想方设法的通过异步编程来减少程序的阻塞,但在某些特殊的场景下我们需要阻塞程序的运行,那么今天就反其道而行之,看看通过怎么样正常的方式来阻塞 Js 运行。

方法一 :无限循环


  • 单线程的 JavaScript 可以给我们灵感,只要程序不断的计算就可以阻塞程序的进程:

1

2

3

4

5

6

7

8

9

10

11

12

function sleep(d){ 

    let t = Date.now();

    while(Date.now() - t <= d); 

}

 

function test() {

    console.log('sleep');

    sleep(10000);

    console.log('run');

}

 

test();

  • 但是这种方式其实是通过无限占用计算机的资源来造成假死状态,它会消耗大量的 CPU,并没有真正的让程序进程停止,这种方式不可取。

方法二 : setTimeout


  • 我们直接用 setTimeout 回调的方式来阻断程序的进程,当然它的确是没有让程序继续进行并且让 CPU 空闲下来,但是这种写法并不是一种同步编程的方式:

1

2

3

4

5

6

7

8

function test() {

    console.log('sleep');

    setTimeout(function() {

        console.log('run');

    }, 10000)

}

 

await

  • ES 的高级版本出现了 Promise、await 等异步编程,它们让程序的写法更佳的优雅简介,同样也要借助于 setTimeout 来解决,建议采用此方式:

1

2

3

4

5

6

7

8

9

10

11

function sleep(ms) {

    return new Promise(resolve => setTimeout(resolve, ms));

}

 

async function test() {

    console.log('sleep');

    await sleep(10000);

    console.log('run');

}

 

test();

方法三 : generator & yield


  • ES6 的迭代器同样也具备异步编程能力,但是这种写法相当晦涩难懂,建议少用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

function sleep(time) {

    setTimeout(function () {

        test.next();

    }, time);

}

 

function* gen() {

    console.log('sleep');

    yield sleep(10000);

    console.log('10 second later');

}

 

let test = gen();

test.next();

总结

阅读剩余部分

相关阅读 >>

pop()方法怎么用

javascript中的generator函数的用法介绍(附代码)

解决javascript中数组排序sort不发生改变

javascript怎么定义对象数组

node.js 15正式版发布,将替代node.js 14成为当前的的稳定发行版

面试常问之javascript变量提升

javascript常用的数据类型有哪些

javascript页面跳转代码有哪些

js是什么语言

javascript怎么添加双实线

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...

    暂无评论...