如何阻塞正在被调用的方法,等前一次调用结束后才执行
如何写一个阻塞的 javascript 方法,如果有其他正在调用则被阻塞直到前一次方法调用完成才执行。
var foobar = function(){
setTimeout(function(){ console.log("hello"); },2000);
}
for(let i = 0;i< 1000; i++){
foobar();
}
比如我想让上面的for循环每2000ms才执行一次循环
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你的意思就是js实现睡眠吧
同步版本
异步版本
一般程序不需要主动阻塞,这样会使程序变得低效,不能充分利用cpu时间,阻塞的场景一般都是IO调用如网络请求等。如果需要主动阻塞,通常是逻辑设计有问题。
如果是需要顺序调用接口,前一次接口调用返回后再调用下一个接口,建议可以这样改逻辑:
如果不关系请求返回,可以将请求做成发送队列,调用的位置不要直接发请求,而是将请求和请求参数作为一个任务加入到发送队列中,然后在队列中完成发送
看了楼上的评论区才知道你的需求。。。正确的提问方式应该是把这个需求描述放到问题中去,这样回答者能够给你更好、更直接的解决方案。
比如你这个单信道复用的实现,最好的方案就是设置一个缓冲队列,每次有数据要发送时,并不是直接去调用发送数据的方法,而是把数据写入缓冲队列,等前一个请求完成的时候,把队列最前面的数据发送出去。
以等待2秒为例,差不多就是这样实现:
但上面这是一个定制性的方案,每管理一种任务就需要完整地抄一遍,为了避免这种重复,我们可以写一个更加通用的解决方案:
剩下的任务就是把你的通信接口写成
Promise
风格交给queueGen
处理一下,然后随时随地addTask
就行了。