javascript无限请求_Javascript 如何阻断程序的运行

3bf02ad6a0cabdf69fbe3ffcc7f369a6.png

通常情况下 JavaScript 是单线程的,一段 Js 程序的运行会占满整个程序进程,我们通常会想方设法的通过异步编程来减少程序的阻塞,那么我们今天反其道而行之,看看通过怎么样正常的方式来阻塞 Js 运行。
无限循环
单线程的 JavaScript 可以给我们灵感,只要程序不断的计算就可以阻塞程序的进程:

function sleep(d){  
    var t = Date.now();
    while(Date.now() - t <= d);  
}

function test() {
    console.log('sleep');
    sleep(10000);
    console.log('run');
}

test();

但是这种方式其实是通过无限占用计算机的资源来造成假死状态,它会消耗大量的 CPU,并没有真正的让程序进程停止,这种方式不可取。
setTimeout
我们直接用 setTimeout 回调的方式来阻断程序的进程,当然它的确是没有让程序继续进行并且让 CPU 空闲下来,但是这种写法并不是一种同步编程的方式:

function test() {
    console.log('sleep');
    setTimeout(function() {
        console.log('run');
    }, 10000)
}

await

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

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 的迭代器同样也具备异步编程能力,但是这种写法相当晦涩,建议少用:

function sleep(time) {
    setTimeout(function () {
        test.next();
    }, time);
}

function* gen() {
    console.log('sleep');
    yield sleep(10000);
    console.log('10 second later');
}

var test = gen();
test.next();

其它
还有一些借助于 Java Applet、Flash、请求服务端的 Sleep 服务,甚至是 node 的 sleep 模块(底层也是调用 C 的 sleep),他们都不是非常纯正的通过 Js 语言本身的特性来处理,当然是可以借鉴。
总结
上述方法总结下来就是两种,一种是强行阻断式利用 Js 的单线程机制;另一种就是借助 Js 的异步事件机制+高级异步编程语法。当然我们在实际业务情况中使用阻断 JS 进程的地方非常少,经常会通过 UI 来禁止用户继续操作,这样的探索仅仅是搞清楚一些 Js 的基本原理,有助于我们很好的了解它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值