例如,我有这两个功能:
var count= function(){
for(i=1;i<=3;i++){
console.log(i);
}
setTimeout(function(){
for(i=1;i<=3;i++){
console.log(-i);
}
},2000);
}
var letters = function(){
var charSet = 'abcdefghijklmnopqrstuvvwxyz'
for(i=0;i<3;i++){
console.log(charSet[i]);
}
}
当我按此顺序执行时:
count();
letters();
我希望得到输出:
1 2 3 -1 -2 -3 a b c
但我得到的是:
1 2 3 a b c -1 -2 -3
为什么函数不等待Timeout完成?我怎样才能达到预期的行为?
答案 0 :(得分:2)
您未获得1 2 3 -1 -2 -3 a b c
的原因是因为您的代码未在setTimeout(...)
来电停止。这是因为许多JavaScript方法本质上都是asynchronous。这意味着它们不会阻止代码的流动。这意味着当您调用setTimeout(...)
时,JavaScript解释器将确保传递到setTimeout
的函数在2000
ms内运行,但不会停止并等待它。它将继续正常的执行流程,进入下一条指令。
如果您希望等待,可以在打印剩余数字(letters()
)后进行-1, -2, -3
来电。
setTimeout(function(){
for(i=1;i<=3;i++){
console.log(-i);
}
letters();
},2000);
答案 1 :(得分:2)
为什么函数不等待Timeout完成?
因为那不是setTimeout
的工作方式。
实际发生的事情是你提出让你的函数运行不少于X毫秒(在你的情况下是2000)的请求。 JS运行时将等待所有其他代码完成运行,然后查看它是否至少为X毫秒。一旦有,你的功能就会运行。但与此同时,您可以运行任何其他JS代码。它故意不阻止其他代码运行。
如何实现理想的行为?
最好的答案是以不同方式构建代码。您需要学习使用异步事件。最简单的方法是使用回调函数:
var count = function(cb) {
for (i = 1; i <= 3; i++) {
console.log(i);
}
setTimeout(function() {
for (i = 1; i <= 3; i++) {
console.log(-i);
}
// Run the function we passed to it after the rest is done
cb();
}, 2000);
}
var letters = function() {
var charSet = 'abcdefghijklmnopqrstuvvwxyz'
for (i = 0; i < 3; i++) {
console.log(charSet[i]);
}
}
count(letters); // Pass `letters` as a callback so it will be called after `count` is done
答案 2 :(得分:1)
因为setTimeout
安排第二个循环稍后运行(在~2秒内),然后立即返回。
Node.js用于异步,事件驱动的编程。您根本不想阻止执行 - 您要求的行为不是&#34;期望&#34;一点都不。
我建议您阅读有关Node.js和异步编程的内容,然后重新访问您实际尝试的内容。你可能想要更像这样的东西:
function count(callback) {
for (i=1; i<=3; i++){
console.log(i);
}
setTimeout(function() {
for(i=1;i<=3;i++){
console.log(-i);
}
callback();
}, 2000);
}
function letters() {
var charSet = 'abcdefghijklmnopqrstuvvwxyz'
for (i=0; i<3; i++){
console.log(charSet[i]);
}
}
然后运行它:
count(letters);