如果JavaScript(大部分)是同步的和单线程的,为什么while循环没有阻止进一步语句的执行
If JavaScript is (mostly) synchronous and single threaded, why does a while loop not block execution of further statements?
我是JavaScript新手!我试图在JavaScript程序中做一个非常天真的阻塞语句。我认为JavaScript是单线程的(除了像setTimeout这样的东西),并且在代码块中是同步的,所以我希望我可以用while循环来阻止代码的执行。我不想使用setTimeout,因为我不确定它是否足够精确,可以做我想做的事情。
让我解释一下。我有一个按钮与class="playback"
,它应该触发一系列的声音播放。回调发出AJAX请求,然后将数据传递给playbackRecording()
。这个函数接受一个有两个属性的对象列表:key_pressed
(帮助确定播放哪个声音,但对这个问题不重要)和time_to_next_key
(等待下一个声音播放的毫秒数)。actionApp()
是使声音实际播放的函数。
我的期望:第一个声音播放。过了一小段时间,下一个动作就发生了。重复,直到完成。
实际情况:经过的时间等于所有按键的time_to_next_key的总和,然后在结束时播放所有声音。
function playbackRecording(content) {
var waitTime = 0;
var keypress = content[0];
actionApp(keypress.key_pressed);
for (var i = 1; i < content.length; i++) {
waitTime += keypress.time_to_next_key;
keypress = content[i];
var end = Date.now() + waitTime;
while(Date.now() < end) {}
actionApp(keypress.key_pressed);
}
}
function playbackLinkClicked(evt) {
var urlString = '/fetch_recording/' + this.id;
$.get(urlString, function(data){
if (data.status === 'success') {
playbackRecording(data.content);
} else {
alert('Could not load recording.');
}
});
}
$('.playback').click(playbackLinkClicked);
我错过了什么?
播放声音是由异步代码完成的(我不知道actionApp()
到底做了什么,但你描述的行为与此一致,这是大多数交互式代码在Javascript中的工作方式)。当你调用actionApp()
时,它把这段代码放到事件队列上。在Javascript返回到主事件循环之前,它实际上不会播放任何内容。
while
循环是同步的,所以你的代码在它们全部完成之前不会返回。每次调用actionApp()
时,它都会向事件队列中添加另一个声音。然后,当它完成时,所有排队的动作被执行。
- 基于两个条件退出While循环
- 希望日期开始结束于while循环中的一个房间id的一个数组
- 为什么我的While循环不起作用
- 使用while循环+break是一种可接受的方式;goto;手术的结束
- 如何将while循环中生成的值存储到变量中,以便以后在JQuery中使用
- jquery,while循环在后台运行,同时while循环
- jquery悬停和while循环
- Javascript:用while循环在给定的count参数中重复一个字符串
- 如何修复 while 循环
- Jquery扩展点的宽度,同时通过while循环递增
- 斐波那契序列Javascript做while循环
- 为什么这个while循环不能使用AND逻辑运算符
- bluebird promise的while()循环正确(无递归?)
- JavaScript while循环没有'不能在有条件的情况下工作
- While循环在JavaScript中永远运行
- 逻辑(JSint友好)等效于while循环中的此赋值
- Javascript:用if语句运行while循环,用子句随机生成内容
- 如何使javascript在SQL while循环中回显所有数据
- 使用ajax循环while中的多个表单
- JavaScript 中的无限循环 - while 循环