Javascript中的异步性

时间:2013-07-18 19:17:47

标签: javascript

我对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));

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

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

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

function next(callback) {
   window.setTimeout(function() {
       if(callback !== undefined) { /* etc. */ }
   }, 0);
}