Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的异步性_Javascript - Fatal编程技术网

Javascript中的异步性

Javascript中的异步性,javascript,Javascript,我对Javascript中的异步性有一个问题。据我所知,Javascript只使用一个线程,但能够异步处理事件 我有以下代码: game.next(); this.autopilot(); 现在,我需要函数游戏。下一步在调用此函数之前完成。自动驾驶仪函数。Javascript实际上是等到游戏“下一步”完成,还是立即运行“自动驾驶仪” 如果是,回调是否解决了问题 具有回调的下一个函数: Game.prototype.next = function(callback) { // Code

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

我有以下代码:

game.next();
this.autopilot();
现在,我需要函数
游戏。下一步
在调用
此函数之前完成。自动驾驶仪
函数。Javascript实际上是等到游戏“下一步”完成,还是立即运行“自动驾驶仪”

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

具有回调的下一个函数:

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

    if(callback !== undefined) {
        callback();
    }
};
game.next(function() {
    this.autopilot();
}.bind(this));
function next() {
   Game.x += 1;
}
使用该回调函数的调用函数:

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

    if(callback !== undefined) {
        callback();
    }
};
game.next(function() {
    this.autopilot();
}.bind(this));
function next() {
   Game.x += 1;
}

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

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

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

    if(callback !== undefined) {
        callback();
    }
};
game.next(function() {
    this.autopilot();
}.bind(this));
function next() {
   Game.x += 1;
}
需要回调以保留执行顺序的异步函数示例:

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

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


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

好吧,这取决于您的
//code
是否执行异步操作,并且您希望该操作“完成”…如果
//code
做了一些异步的事情,那么
回调
没有帮助,因为异步部分将在
回调
之后执行,如果看起来是这样的话。回调需要从异步部分调用。我明白了,所以如果
//code
中的所有代码在完全完成后返回,我真的不需要回调吗?它会计算一些东西并遍历调用函数的其他对象的列表,但不会运行异步代码。这样就可以了,同步代码将按您所需的顺序运行。可能最好还是使用vanilla js,使用值为
0
setTimeout
,而不是使用jQuery。