0
setTimeout(function() {
    console.log("1");
}
console.log("2");

基本上,我想在“2”之前输出“1”。如何将回调函数与当前的“调用者”线程同步?

4

2 回答 2

3

尝试类似:

setTimeout(function() {
    console.log("1");
    callback();
}
function callback(){
   console.log("2");
}
于 2012-05-21T17:15:09.733 回答
3

你不能在 JavaScript 中阻止线程(除了alertconfirm内置),所以在你console.log("2")之后实现你的唯一方法console.log("1")是:

  1. 把它放在超时函数中:

    setTimeout(function() {
        console.log("1");
        console.log("2");
    }, delay);
    

    ...或在该超时函数调用的另一个函数中,尽管您已经有一个用于 的函数setTimeout,但不清楚(除了代码组织)为什么需要一个单独的函数。

  2. 把它放在一个单独的函数中setTimeout,延迟时间更长:

    setTimeout(function() {
        console.log("1");
    }, delay);
    setTimeout(function() {
        console.log("2");
    }, longerDelay);
    

    ...要小心,这longerDelay真的比delay你在日程安排上不会有一点混乱的时间要长得多。

注意我在上面说的是“线程”。除非您使用具有特定语法的网络工作者,否则浏览器上的 JavaScript 是单线程的。两个 JavaScript 函数不能同时运行,除了边缘情况下的浏览器错误alert和 ajax 完成等(至少某些版本的 Firefox 会在您等待函数时运行您的 ajax 完成回调alert;奇怪但真实,没有什么可以依赖的在跨浏览器甚至跨版本上),您不能在运行另一个 JavaScript 函数时暂停一个 JavaScript 函数。

于 2012-05-21T17:15:20.730 回答