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();

总结

阅读剩余部分

相关阅读 >>

javascript json字符串如何转换成对象

javascript如何使用trim方法

如何用js求圆的面积

屏蔽javascript会怎样

javascript如何实现json字符串与对象转换

如何中断foreach循环(详细介绍)

javascript中导入js文件的两种方式

jscript和javascript的区别是什么

js中call、apply、bind的区别

如何给js创建一个数组对象

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




打赏

取消

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

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

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

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

评论

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