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