3

我有一个关于 Javascript 中的异步性的问题。据我所知,Javascript 只使用一个线程,但能够异步处理事件。

我有以下代码:

game.next();
this.autopilot();

现在,我需要在调用函数game.next之前完成this.autopilot函数。Javascript实际上是等到game.next完成还是立即运行this.autopilot

如果是这样,回调是否解决了问题?

下一个带有回调的函数:

Game.prototype.next = function(callback) {
    // Code

    if(callback !== undefined) {
        callback();
    }
};

使用该回调的调用函数:

game.next(function() {
    this.autopilot();
}.bind(this));
4

2 回答 2

4

在您的代码中,game.next()必须在this.autopilot()调用之前返回。

但是,有可能game.next()启动一个异步进程(例如,一个 Ajax 调用)并在进程完成之前返回。如果您想推迟执行this.autopilot()直到该过程完成,那么您将需要某种回调机制。game.next()必须将回调函数传递给正在发生的任何异步处理。(正如您在问题中所建议的那样,在返回之前执行回调是错误的,因为这也会在异步过程完成之前发生。)

于 2013-07-18T19:19:08.637 回答
2

是的,您可以使用回调来确保game.next()this.autopilot(). 但是有一个技巧:你不能在任何代码之后粘贴一些回调。是否需要实现回调取决于game.next()函数是否异步。

不需要回调的同步函数示例:

function next() {
   Game.x += 1;
}

需要回调以保留执行顺序的异步函数示例:

function next(callback) {
   window.setTimeout(function() {
       if(callback !== undefined) { /* etc. */ }
   }, 0);
}
于 2013-07-18T19:19:07.807 回答