【发布时间】:2012-05-22 01:50:31
【问题描述】:
setTimeout(function() {
console.log("1");
}
console.log("2");
基本上,我想在“2”之前输出“1”。如何将回调函数与当前的“调用者”线程同步?
【问题讨论】:
标签: javascript synchronization settimeout
setTimeout(function() {
console.log("1");
}
console.log("2");
基本上,我想在“2”之前输出“1”。如何将回调函数与当前的“调用者”线程同步?
【问题讨论】:
标签: javascript synchronization settimeout
您无法在 JavaScript 中阻止线程(alert 和 confirm 内置函数除外),因此使您的 console.log("2") 在您的 console.log("1") 之后发生的唯一方法是:
放到超时函数中:
setTimeout(function() {
console.log("1");
console.log("2");
}, delay);
...或在该超时函数调用的另一个函数中,尽管您已经有一个用于 setTimeout 的函数,但不清楚(除了代码组织)为什么需要一个单独的函数。
把它放在你传递给setTimeout的一个单独的函数中,延迟时间更长:
setTimeout(function() {
console.log("1");
}, delay);
setTimeout(function() {
console.log("2");
}, longerDelay);
...请注意longerDelay 确实比delay 长得多,这样您就不会在日程安排方面遇到一点混乱。
注意我在上面说的是“线程”。除非您使用具有特定语法的 web workers,否则浏览器上的 JavaScript 是单线程。两个 JavaScript 函数不能同时运行,除了围绕 alert 和 ajax 完成等的边缘情况浏览器错误(至少某些版本的 Firefox 运行您的 ajax 完成回调,而您有一个函数等待 alert;奇怪但真实,并且没有任何东西可以依赖跨浏览器甚至跨版本),您不能在运行另一个 JavaScript 函数时暂停一个 JavaScript 函数。
【讨论】:
尝试类似:
setTimeout(function() {
console.log("1");
callback();
}
function callback(){
console.log("2");
}
【讨论】: